Как проверить принадлежность точки (X, Y) к треугольной области (X1, Y

Тема в разделе "WASM.BEGINNERS", создана пользователем AlexPAV_NSO, 5 май 2007.

  1. AlexPAV_NSO

    AlexPAV_NSO New Member

    Публикаций:
    0
    Регистрация:
    5 май 2007
    Сообщения:
    7
    Как проверить принадлежность точки (X, Y) к треугольной области (X1, Y1; X2, Y2; X3, Y3)??? Помогите пожалуйста, очень надо!!!
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    X должна быть одновременно больше 2-х координат и меньше 1-й координаты, либо меньше 2-х координат и больше 1-й, соответственно с игрик.
     
  3. AlexPAV_NSO

    AlexPAV_NSO New Member

    Публикаций:
    0
    Регистрация:
    5 май 2007
    Сообщения:
    7
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    напиши процедуру. и пихай туда сначала х, потом у
     
  5. AlexPAV_NSO

    AlexPAV_NSO New Member

    Публикаций:
    0
    Регистрация:
    5 май 2007
    Сообщения:
    7
    Данное условие является недостаточным! Т.к. имеются точки удовлетворяющие этому условию, но не принадлежащие данному треугольнику!
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    twgt
    Это условие необходимое, но не достаточное, что легко проверяется на элементарных примерах. Варианты достаточных условий
    1) метод луча: луч, например x:=Xo проведенный вправо от точки, должен либо пересекать одну (и только одну) сторону треугольника, либо проходить через его вершину и при этом отрезки, выходящие из этой вершины, должны лежать по разные стороны от луча.
    2) метод обхода контура: точка должна лежать по одну сторону от всех трех (направленных) прямых, проходящих через стороны треугольника

    PS: О, пока я сочинял ответ, AlexPAV_NSO уже убедился в недостаточности простых сравнений X, Y ;)

    PPS: Добавил доп.условие для случая прохождения луча через вершину
     
  7. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    leo
    Эхх... а я тут разрисовался блин.. не успел ))))
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    nitrotoluol
    Только еще 4 хитрых случая не нарисовал: прохождение луча через вершину и через сторону треугольника когда точка внутри (или на стороне) и снаружи ;)
     
  9. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    leo
    Там и одного случая хватит, хотя если признаться, мне только 2 варианта в голову пришло... )) Вот этот и с углами. Там по теореме синусов углы находим и сравниваем то что приводилось twgt
    плюс сравниваем улол между двумя сторонами и одной из этих сторон и лучом.

    А с вершиной там как...?
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    nitrotoluol
    В методе луча можно и без синусов обойтись только сравнением координат.
    Луч, проведенный из точки (X0,Y0) вправо пересекает отрезок (X1,Y1)-(X2,Y2) если
    ((Y1 >= Y0) or (Y2 >= Y0)) and ((X1 >= X0) xor (X2 >= X0))
    Если пересечение оказывется в вершине, т.е. X1=X0 или X2=X0, то смотрим как расположены Y противоположных точек отрезков, например при X2 = X0 д.б. (Y1 >= Y0) xor (Y3 >= Y0), в противном сл.точка лежит вне треугольника и луч просто касается вершины __\/__

    PS: из-за возможности прохождения луча через отрезок (т.е. через две вершины __/_\_), проверки на равенство д.б. похитрее
     
  11. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Самый простой метод - посчитать площади треугольников:
    если дан треугольник ABC, точка X, то
    S(ABC) = S(ABX)+S(ACX)+S(BCX), если точка лежит внутри треугольника.
    Площади легко считать по формуле Герона
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    maxdiver
    ИМХО, ориентированная площадь по координатам считается проще и быстрее
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    maxdiver
    Раз пошла такая пьянка, то самый простой способ в данном случае - обход контура
    Точка строго внутри треугольника, если все три величины
    side1 = (Y2-Y1)*(Xo-X1)-(X2-X1)*(Yo-Y1)
    side2 = (Y3-Y2)*(Xo-X2)-(X3-X2)*(Yo-Y2)
    side3 = (Y1-Y3)*(Xo-X3)-(X1-X3)*(Yo-Y3)
    имеют один и тот же знак
     
  14. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    А вообще в fp принимаются решения?

    Мой вариант:
    Берем иссл. точку(S) и ближайшую и ней(A). Если S внутри ABC, то расстояния от нее до C и D меньше расстояний до тех же вершин от точки A.
    Реализуется элементарно, на мой взгляд.
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    dr_dred
    Во-первых откуда взялась вершина D? Во-вторых, если там не D, а B, то условие недостаточное.
     
  16. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Да, опечатка вышла, но почему недостаточно такой проверки?
     
  17. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    dr_dred
    Не достаточное условие. Возьми точку вблизи стороны острого угла, и увидишь что она может быть как внутри, так и снаружи, хотя расстояния до вершин меньше. А лучше проведи круги из B и C через A и убедись, что область их пересечения выходит за пределы треугольника
     
  18. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    Понятно, спасибо.
     
  19. AlexPAV_NSO

    AlexPAV_NSO New Member

    Публикаций:
    0
    Регистрация:
    5 май 2007
    Сообщения:
    7
    В Win есть функция PtInRegion(RGN: HRGN; X, Y: Integer): Bool (gdi32.dll) для областей, но работает она слишком медленно!
     
  20. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    leo
    Это же уравнение прямой на плоскости через две точки практически!
    Интересное решение, надо запомнить.