На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Определить входит ли точка в пирамиду , ну не совсем в пирамиду....
    Цитата MBo @
    Следующая функция проверяет, находится ли точка P внутри тетраэдра ABCD. По сути это разложение вектора AP по векторам AB, AC, AD.
    Четырехгранную пирамиду нетрудно разбить на два тетраэдра.
    А для проверки, находится ли точка внутри пространственного угла, нужно убрать ограничение отсечения задней плоскостью - сравнение с Det
    ExpandedWrap disabled
      function PtInTetrahedron(ax, ay, az, bx, by, bz, cx, cy, cz, dx, dy, dz, px, py, pz: Integer): Boolean;
      var
        Det, b, c, d: Integer;
        cdx, cdy, cdz: Integer;
      begin
        Result := False;
        bx := bx - ax;
        by := by - ay;
        bz := bz - az;
        cx := cx - ax;
        cy := cy - ay;
        cz := cz - az;
        dx := dx - ax;
        dy := dy - ay;
        dz := dz - az;
        px := px - ax;
        py := py - ay;
        pz := pz - az;
        cdx := cy * dz - cz * dy;
        cdy := cz * dx - cx * dz;
        cdz := cx * dy - cy * dx;
        Det := bx * cdx + by * cdy + bz * cdz;
        if Det <> 0 then begin
          b := px * cdx + py * cdy + pz * cdz;
          c := px * (dy * bz - dz * by) + py * (dz * bx - dx * bz) + pz * (dx * by - dy
            * bx);
          d := px * (by * cz - bz * cy) + py * (bz * cx - bx * cz) + pz * (bx * cy - by
            * cx);
          if Det > 0 then
            Result := (b >= 0) and (c >= 0) and (d >= 0) and (b + c + d <= Det)
          else
            Result := (b <= 0) and (c <= 0) and (d <= 0) and (b + c + d >= Det);
        end;
      end;

    Здравствуйте, спасибо огромное за функцию

    Подскажите, пожалуйста, откуда берутся условия (из каких алгебраических предпосылок)
    1)(b + c + d <= Det) в первом случае
    2)(b + c + d >= Det) во втором случае
      На двумерном примере:
      Вектор AP есть линейная комбинация векторов AB, AC:

      AP = b * AB + c * AC
      Для точек внутри треугольника ABC коэффициенты положительны, и их сумма не превышает единицы (единица достигается только на ребрах).

      В данном случае коэффициенты не нормированы (делением на Det), и сравнение проводится с величиной Det
        Цитата MBo @

        Спасибо
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0331 ]   [ 15 queries used ]   [ Generated: 16.04.24, 13:09 GMT ]