exAres
I love magic :)
offline
Опыт:
7,788Активность: |
Как просчитать пересечение двух линий
У меня проблема : не знаю как узнать что две линии пересеклись(у меня есть стена(юнит с двумя точками:начала и конца)и кастер(юнит который должен кастить через стену)). Как узнать что юнит кастит именно через стену ? Ну у меня не на одного юнита должно быть розсчитано, ну типа мне нужно знать именно когда любой вражеский юнит будет кастить через ету стену. |
17.04.2006, 15:56 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exAres
I love magic :)
offline
Опыт:
7,788Активность: |
Аааааааауууууууу !!! Что никто не знает как ето зделать ? Может я не очень хорошо обьяснил ? Так вы скажите что не ясно, я уточню ! |
17.04.2006, 22:39 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Iron
Листовой
offline
Опыт:
24,427Активность: |
Ну координаты то нам известны (или получаемы триггерно). Остается только составить 2-а уравнения прямых, потом решать систему этих двух уравнений, и проверять решения системы на то, входят они в границы отрезков или нет. Короче, если в 2-х словах - гемор редкостный. |
18.04.2006, 00:28 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
В-общем ответы на такие вопросы следует искать как-то так
И в результате получаем что-то такое http://alglib.sources.ru/geometry/sectint.php http://doc-for-prog.narod.ru/topics/math/crossing.html http://www.gamedev.ru/forum/?group=0&topic=20732 Хотя что-то мне помницца их можно через определитель матрицы, составленной из точек(?) найти NETRAT добавил: Это по-школьному геморр, а вообще есть "прямые" формулы, в которые достаточно просто подставить координаты |
18.04.2006, 11:51 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YoGA
offline
Опыт:
243Активность: |
Салют от матфака ОмГУ! :)
Будем считать, что прямые заданы точками: (xb1, yb1) - (xe1, ye1) и (xb2, yb2) - (xe2, ye2)
Для удобства введем новые переменные: a1 = xe1 - xb1 b1 = ye1 - yb1 a2 = xe2 - xb2 b2 = ye2 - yb2 Вектора (a1, b1) и (a2, b2) не должны быть коллинеарны, т. е. необходимое условие для существования искомой точки пересечения: a2 * b1 - a1 * b2 не равно 0 Тогда координаты точки пересечения заданных прямых равны: x = xb2 + a2 * p y = yb2 + b2 * p где p = ((xb2 - xb1) * b1 - (yb2 - yb1) * a1) / (a2 * b1 - a1 * b2) Теперь нужно проверить, принадлежит ли найденная точка заданным отрезкам. Для этого необходимо выполнение неравенств: x >= min (xb1, xe1) x >= min (xb2, xe2) x <= max (xb1, xe1) x <= max (xb2, xe2) y >= min (yb1, ye1) y >= min (yb2, ye2) y <= max (yb1, ye1) y <= max (yb2, ye2) Вот и все, вроде. Я нигде не ошибся? |
18.04.2006, 12:29 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Iron
Листовой
offline
Опыт:
24,427Активность: |
YoGA В общем ты расписал, то что я и говорил. Имхо это гемор.
|
18.04.2006, 13:44 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exAres
I love magic :)
offline
Опыт:
7,788Активность: |
YoGA - Сенк! Ща буду считать.
|
18.04.2006, 15:15 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exAres
I love magic :)
offline
Опыт:
7,788Активность: |
YoGA я неправильно понял или... незнаю но у меня такая функция :
Код:
и приставная функция пересечения(ну типа я задаю координаты а оно мне - пересеклись линии или нет): Код:
но при запуске через стену у меня на екране появляется лишь CHECK a SPELL не хочет :( Что не так ? |
18.04.2006, 18:58 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
YoGA
offline
Опыт:
243Активность: |
Попробуй в знаменателе p поменять местами произведения, т.е.
p = ((xb2 - xb1) * b1 - (yb2 - yb1) * a1) / (a1 * b2 - a2 * b1)
и еще, в твоем коде условие a2*b1-a1*b2!=0 нужно поставить в начале, т.е. если a2*b1-a1*b2==0,то выйти из функции, вернув false, а блок set x=xb2+a2*p set y=yb2+b2*p сделать безусловным, но оставить в конце. Если условие в конце, то при a2*b1-a1*b2==0 знаменатель p станет равным 0 и возникнет ошибка. |
19.04.2006, 13:20 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Алексей
Где кошачья мята?!
offline
Опыт:
26,543Активность: |
В общем, ошибку искать лень, поэтому выкладываю тот алгоритм, который используется в MdlVis (для определения, пересекаются ли отрезки). Его основное достоинство заключается в том, что в нём нет ни единой операции деления (а значит, не нужны проверки на 0).
Код предварительно проверил (скопировал прямо из редактора триггеров WE), всё работает: Код:
Как вы понимаете, (ax1,ay1)-(ax2,ay2) - первый отрезок, а (bx1,by1)-(bx2,by2) - второй. Причем без разницы, где у отрезков начало, а где конец (точки можно подавать в произвольном порядке). Математические основы алгоритма излагать не буду (т.к. всё равно оно никому не нужно - лишь бы работало ;)). Скажу только, что тут не решается уравнение прямой, а просто анализируется взаимное расположение точек (чётность/нечётность перестановок). |
19.04.2006, 15:19 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
exAres
I love magic :)
offline
Опыт:
7,788Активность: |
Алексей спасибо но я посмотрел на одном сайте... и сделал так
Код:
и всё работает так что тему можна закрыть. |
19.04.2006, 19:02 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
NETRAT
offline
Опыт:
83,712Активность: |
MrSmiLe в точке с Х=0 функция срабатывать не будет - ибо деление на ноль, Алексей дело говорит
Гм, интересно, с такой проверкой не сталкивался, надо обмозговать... |
20.04.2006, 02:40 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
54,313Активность: |
NETRAT если раьлта с рилами то вероятность что будет ровно 0 практически не возможна ! хотя если так то можно ставить проверку если 0 то делать 1 и всё :)
Алексей - рульно ;) |
20.04.2006, 14:40 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|