singlepost

Как определить или доказать находится ли точка в треугольнике? << На главную или назад  

Дан треугольник и точка лежащая в этом тоеугошльнике. Как доказать что точка лежит в треугольнике? (точка может перемещаться)

45 ответов в теме “Как определить или доказать находится ли точка в треугольнике?”

  1. 14
    Леонид Максимов ответил:

    еще один способ, похож на предложенный Дмитрием Потаповым #12 (кстати там вычитаний больше, т.к. AB.x = A.x – B.x)

    в общем – если точка лежит с одной стороны от каждой из сторон треугольника (например с левой при обходе против часовой стрелки), то точка лежит внутри треугольника. в общем, несколько умножений/вычитаний.

  2. 13
    Юрий Петров ответил:

    Если не секрет, на чем основаны критерии оптимальности? =)
    1-й предложенный способ выполняет в разы больше арифметических действий, чем описанный выше. 2-й вообще (почти?) не выполняется в целых числах.
    И, кстати, кто есть Меньшиков и как называется его соответствующая публикация? =)

  3. 12
    Максим Двойнишников ответил:

    мда… уж. Оптимальных есть три способа:
    1) высчитать сумму площадей по формуле abs(x1*y2+x2*y3+x3*y1-y1*x2-x3*y2-y3*x1)/2 и сравнить ее с площадью треугольника. ИМХО лучший способ.
    2) по векторам сумму углов – хороший способ, но есть возможность погрешности.
    3) читайте Меньшикова! хорошо пишет

  4. 11
    Дмитрий Потапов ответил:

    if( (AB.x*AO.y-AB.y*AO.x)*(AC.x*AO.y-AC.y*AO.x) < 0 && (BA.x*BO.y-BA.y*BO.x)*(BC.x*BO.y-BC.y*BO.x) < 0 )
    std::cout<<"Inside"<<std::endl;
    else
    std::cout<<"Outside"<<std::endl;

    10 умножений, 4 вычитания, два сравнения.
    просто вычисляется что точка лежит внутри двух углов треугольника – этого достаточно

  5. 10
    Михаил Чарушин ответил:

    можно через векторы, в D3D есть функции для этого
    D3DXVec3Cross
    D3DXVec3Dot

  6. 9
    Алексей Вержуцкий ответил:

    еще вариант разбить главный треугольник на 3 треугольника с этой точкой, и посчитать сумму их плащадей, если будет больше главного треугольника значит вне его. Если площадь меньше или равна – значит внутри.

    У меня на вводной практике была эта задача. решал этим способом в экселе ^_^

  7. 8
    Иван Афанасьев ответил:

    1. Вариант
    а) Соединяем точку с вершинами треугольника.
    б) Считаем углы.
    в) Точка лежит внутри труегольника <=> сумма углов = 360

    2. Вариант

    а) Считаем барицентрические коордниаты x, y.
    б) Точка дежит внутри треугольника <=>
    0<=x and 0<=y and x+y <= 1. При выполнении хотя бы одного равенства точка лежит на сторонах треугольнка.

    3. Вариант ( описан ранее вариант с площадями )
    4. Вариант ( уравнения прямых )

    Что касается реализации – самые эффективные методы – 2 и 4. Они не требуют никаких трудоемких функций типа arccos или sqrt.

    Вообще их дохренища алгоритмов – если будет интересно – поищи в гугле – есть несколько сайтов с мат алгоритмами, в том числе и геометрическими. Кпримеру, algolist.ru.

    Ах, да, как можно такое забыть ?!!!

    5. Метод трассировки луча :)

  8. 7
    Антон Иванов ответил:

    Большое спасибо!!!!!!

  9. 6
    Антон Иванов ответил:

    желательно всё что возможно!!!!!
    Я хочу знать алгоритм!
    Здесь очень нужна математика!
    Доказательства без линеек!

    А как определить в каком из трёх треугольников лежит точка?
    И как определить какую боковую прямую треугольника она пересекает?

  10. 5
    Антон Иванов ответил:

    мне программу не надо писать ни в коем случае – я сам напишу – мне нужен чисто математический алгоритм!!!!!!

  11. 4
    Юрий Петров ответил:

    Иван, насчет еще вариантов ответил здесь: //vkontakte.ru/board.php?act=topic&tid=1956... +)

  12. 3
    Александр Чигринец ответил:

    Не понял, нужна математическая выкладка или программное решение?

  13. 2
    Иван Димитриев ответил:

    Судя по группе где задали вопрос думаю что все-таки программное :) . Но сомневаюсь что кто-то захочет писать программу за автора вопроса, только возможные алгоритмы напишут. Кстати, еще есть варианты как решить эту задачу?

  14. 1
    Иван Димитриев ответил:

    Не думая на ум приходит такой алгоритм…
    Пусть треугольник ABC и точка O.
    Известны координаты точек => находим уравнения прямых AB, BC, AC, AO, BO, CO. Далее находим пересечения прямых AO и BC, BO и AC, CO и AB. И проверяем что точки пересечения принадлежат отрезкам BC, AC и AB соответственно.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.