проверка наличия точки внутри области

Тема в разделе "WASM.A&O", создана пользователем slow, 16 янв 2006.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    есть мысли по этому поводу?



    область задается набором точек (конечным)

    точки соединены либо гладкой кривой либо отрезками прямой



    что-то сразу не соображу как это сделать побыстрее

    [​IMG] 970261033__
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    если область выпуклая и ограничена ломаной (те выпуклый многоугольник), то всё просто. надо задаться направлением обхода границы, и убедиться что точка лежит справа (или слева, в зависимости от направления обхода) относительно прямых содержащих стороны этого многоугольника. А если многоугольник не выпуклый, то его можно представить как объединение выпуклых. Если же стороны криволинейные, то всё несколько хуже, но можно попытаться адаптировать этот способ и к криволинейным. Или проверять с погрешностью.

    Наверняка где-нибудь в инете даже валяется статейка на этот счёт.
     
  3. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Есть еще один метод. В зависмости от того как заданы и расположены границы области он может быть легче а может быть сложнее. Для сложных невыпуклых областей он вроде считается хорошо работающим.



    Суть в следующем - из точки пытаешься "выбраться" наружу - в бесконечность - проще всего по прямой параллельной одной из осей, например, бесконечно вправо. И считаешь при этом сколько раз пересек границу. Если четное число раз - значит ты был снаружи области, если нечетное - значит был внутри.
     
  4. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    r90

    OLS

    thanx

    r90

    для многоугольника ваше предложение оптимально (я тоже думал об ориентации но склонялся к ориентированным площадям так как надо все же для кривых)

    но вот привязать эту методу к случаю кривых (Безье, порядок n-1) пока не могу.

    Идея с площадями медленна. Хотя наверное если быстро считать площади..

    OLS

    интересное предложение, сэнкс

    правда, сложно определить было ли пересечение границы :)
     
  5. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    правда, сложно определить было ли пересечение границы :)



    разве сложно для аналитически заданной кривой решить уравнение x=x0 или y=y0, где (x0,y0) - координаты твоей точки ?
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    OLS



    Не все йогурты одинаково полезны... Тоесть это... Далеко не все уравнения решаются аналитически. Да и численно тоже.
     
  7. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    _DEN_



    Если мне не изменяет память, кривые Безье - бесконечно дифференцируемы (по независимой переменной) и самонепересекаются.
     
  8. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    OLS

    собственно уравнение решить не оч сложно. задачка вроде нахождения корней у полинома этак 5й-20й степени :)



    чем больше решаю эту задачу тем больше понимаю что наверное выбрал неверный метод :-(



    и кстати говоря, интересен случай некоторых гладких кривых с самопересечениями (тех что рисует GDI+ при исп-ии метода DrawClosedCurve)



    _DEN_

    ценю ваше чувство юмора :))
     
  9. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    если интересно кому, задача связана вот с чем: делаю некую программу рисования замкнутых кривых на карте(обычный jpeg) по узлам. кривые можно "изгибать" drag'n'drop-ом а также заливать цветом с регулировкой прозрачности



    так вот, для уменьшения мерцания при отрисовке и повышения скорости надо перерисовывать не все кривые а только те, которые пересекаются с изменяемой в данный момент кривой
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    slow

    Это делается иначе. Когда ты изменяешь кривую, ты берешь рисунок без этой кривой для рисования используешь операцию Xor. Как только линия переместилась затираешь ее, просто рисуешь ее с операцией Xor на старом месте. И рисуем на новом месте. По окончанию операции манипуляции рисуешь линию окончательно.
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Pavia

    thanx

    хорошая идея

    токо придется вручную реализовывать рисование кривой попиксельно :-((
     
  12. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    slow

    зачем вручную ? просто ставишь стиль для Pen как что-то-там-XOR и рисуешь сначала по старым координатам а затем по новым.
     
  13. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    infern0

    thanx
     
  14. 3ahyga

    3ahyga New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2006
    Сообщения:
    24
    Адрес:
    Стольный град Москов
    Как OLS правильно предложил метод, но есть у него дополнение, когда прямая проходит через вершину, от которой оба ребра выходят в одну сторону от данной прямой! Например, прямая горизотальная, проходит через вершину, образуемую двумя рёбрами, находящимися ниже этой прямой!