Подскажите алгоритм столкновений 2D

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Подскажите алгоритм столкновений 2D

Сообщение X-BOND » 07.01.2004 (Ср) 11:12

Итак, у меня есть некоторый многоугольник, который формирует произвольную фигуру. Каждая точка (вершина многоугольника) имеет свою координату XY. Также имеем некоторый субъект (на рисунке синий треугольник) который может произвольно перемещаться в 2D пространстве, но не должен заходить за пределы фигуры. Как можно это вычислить?

Изображение

P.S.
Вершин реально будет гараздо больше (100-500 на фигуру)
Может лучше использовать кривые Безье?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 07.01.2004 (Ср) 15:40

Если фигура нарисована на PictureBox, а цвет фона и фигуры равномерен - проще всего читать цвет пикселя перед помещением туда объекта.

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 07.01.2004 (Ср) 15:45

Согласен, но это только каркас, на который наложится графика, и там по пикселям ничего не разберешь.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.01.2004 (Чт) 10:52

Может, создавать регион по контуру, а потом юзать PtInRegion?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.01.2004 (Чт) 16:12

Или, если не лимитирует память, держать невидимую картинку с образом "занятой" территории. Так же, как Z-буфер, только записывать не глубину, а наличие препятствия, достаточно 2-х цветной картинки. И дальше пользоваться моим методом. Зато быстродействие абсолютно не будет зависить от сложности форм препятствий.

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 09.01.2004 (Пт) 13:33

Оба варианта очень интересные, рассмотрю подробнее...
Спасибо :wink:

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 09.01.2004 (Пт) 14:34

А можно вообще держать массив координат (x,y) объекта в памяти. И перебирать по циферкам.
Тогда можно вычислять длину вектора по направлению движения объекта и задавать расстояние "сближения до удара". Единственное плохо - перебор всех элементов для больших объектов - долгое занятие.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 10.01.2004 (Сб) 22:33

хмм......Вот те алгоритм:
Судя по всему у тебя вертексы рандомально расположены.
Если нет, и есть формула, то просто подставь в нее координаты точки. Если результат больше нуля то точка вне функции, если меньше, то в функции.

Если формулы нет, то составь массив координат точек типа:
Arr(X,Y)

Далее, циклом берешь пару точек и вставляешь в формулу прямой линии:
Код: Выделить всё
Y+Y1 = M(X+X1)

M=(Y1-Y2)/(X1-X2)


Y1, X1 - координаты первой точки
X2, Y2 - второй

Затем составляешь уравнение:

Код: Выделить всё
Y + MX = 0


Ну и вместо, Y и X, подставляешь координаты треугольника.
Если больше нуля, то треугольник справа, иначе слева
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 12.01.2004 (Пн) 12:32

Спасибо за алгоритм :wink:
Но я соглашусь с Гайдаром, что данный код подойдет больше для несложных фигур. Иначе прога будет тормозить, особенно с множеством объектов и в реальном времени. С регионами вообще все просто. Есть уже готовая функция (спасибо GSerg). А принцип Mikle очень хорош для абсолютно любых форм, буквально попиксельно можно все просчитать.
Вообще все это теория, щас я только собираю инфу для своего проекта (если кому интересно, смотрите у меня на сайте в разделе проекты). Когда начну писать код, все это может пригодиться.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

    TopList  
cron