![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ещё раз о столкновении [Delphi, Windows]
Xandr © (2006-02-25 20:31:00)суть:
есть непроходимые тайлы их нужно заменить линиями.
есть существа, их нужно заменить кругами.
вот в чём проблема: как лучше организовать замену, и САМОЕ главное - как проверить пересеклись ли окружность и кривая?
ЗЫ к математике не отправлять, уравнения прямых и окружностей я знаю, и умею решать системы уравнений. (правда на бумаге)
Xandr (2006-03-03 12:31:00) [1]вот: webfile.ru/840296 (~192K)
у меня там 2 окружности. одной управляет польз-тель, другая статичная (её можно передвигать "толкая" управляемой.
Все вроде хорошо, но только иногда возникают ситуации, когда неуправляемая окружность наталкивается на линию, управляемая "наезжает" на неё.
никак не пойму в чём дело. хелп если не лень.
Xandr (2006-03-02 18:04:00) [2]Вооот, а теперь не подскажете ли, алгоритм коллизий окружности и прямоугольника?
Xandr (2006-03-02 17:11:00) [3]Удалено модератором
XProger (2006-03-01 22:02:00) [4]да
Xandr (2006-03-01 21:25:00) [5]а по поводу [26]?
XProger (2006-03-01 21:19:00) [6]Типа :)
Xandr (2006-03-01 21:13:00) [7]кстати извиняюсь за фамильярничество, если это вдруг кого задело!
по поводу [25]:
насколько я понял это что - то типа отталкивающего поля получается, да?
Xandr (2006-03-01 21:07:00) [8]XProger,
а нормализовать это что типа этого:
Result.X := с.X / Lenght;
Result.Y := с.Y / Lenght; (?)
Помоему у тебя же и подсмотрел...
XProger (2006-03-01 20:53:00) [9]Можно иначе. Проводим вектор (V) от точки отрезка до центра окружности. Находим его длину (R). Если она меньше Radius окружности - идём дальше. Нормализуем его (V -> N). Затем производим сдвиг центра окружности на N * (Radius - R). Не исключены случаи, когда окружность будет "колбасить" в определённых ситуациях.
Xandr (2006-03-01 20:31:00) [10]вот родился из коленки алгоритм:
-опускаем от прямой, содержащей отрезок, перпендикуляр на точу направления. (вектор а)
-новое направление = положение круга + вектор ист. направления + вектор а.
вот вопросы:
1.будет ли сие работать?
2.Ну НАВЕРНЯКА уже есть готовые алгоритмы решения этой задачи (или нет?)
3.Можно ли зделать проще?
XProger (2006-03-01 19:41:00) [11]Пересечение точки с окружностью, а куда отталкивать - нарисуй на листочке - поймёшь (связано с направлением скорости перемещения окружности)
Xandr (2006-03-01 19:31:00) [12]ну, я опять не то сказал...
пишу ночью, вот и туплю :)
с коллизиями всё как раз в порядке.
дело в другом: мне нужно чтобы окружность при столкновении с отрезком, продолжала двигаться вдоль него в направлении, наиболее близком к указываемой точке. При столкновении с самим отрезком, я это реализовал (вычитанием из вектора направления одну из его состовляющих, перпендикулярную отрезку {**}). :)
проблема возникла с концами отрезка :)))
т.е. если окружность находится напротив конца отрезка, а вектор направления походит ~ вдоль него, то такой алгоритм (**) не работает! :(
XProger (2006-02-28 21:42:00) [13]XProger © (25.02.06 21:35) [3]
Найди расстояние от центра окружности до прямой, если меньше радиуса окружности - пересечение.
http://algolist.manual.ru/maths/geom/distance/pointline.php
Xandr (2006-02-28 19:57:00) [14]угу.
уже сам допёр.
но всё равно спасибо.
Блин.
вот тут пытаюсь написать простейшую CAD систему (для движка), запарился на самом простом: колизии отрезка с окружностью. (корее всего опять перемудрил там чё-то)
есть у кого нибудь ссылочки, где можно почитать по этому поводу что-нибудь (хотябы общие принципы)?
если это важно то "игра" - изометрическая проэ(е?)кция.
XProger (2006-02-28 16:43:00) [15]
dx := lin[i + 1].x - lin[i].x;
dy := lin[i + 1].y - lin[i].y;
moveto(lin[i].x, lin[i].y);
lineto(lin[i].x + dx, lin[i].y);
lineto(lin[i].x + dx, lin[i].y + dy); // lineto(lin[i + 1].x, lin[i + 1].y);
Xandr (2006-02-27 19:43:00) [16]
> Перпендикуляр к ветору = (-Y, X)
вот у меня так:
...
lin: array[0...10] of TPoint;
...
dx:=lin[i+1].x-lin[i].x;
dy:=lin[i+1].y-lin[i].y;
moveto(lin[i].x,lin[i].y);
lineto(lin[i+1].x,lin[i+1].y);
lineto(-dy,dx);
и такую фигню мне рисуют! :)
что не так?
A22 (2006-02-27 19:11:00) [17]концы гипотенузы - A и B, неизвестная точка - T.
длины катетов - a, b:
a*a = (T.x - A.x) + (T.y - A.y)
b*b = (B.x - T.x) + (B.y - T.y)
два уравнения, два неизвестных
а вообще: "как отсечь от вектора одну из его состовляющих, перпендикулярную к.л. отрезку?"
то формулу для перпендикулярного уже указали = (-y,x), соответственно по "к.л." отрезку строим перпендикулярный и убираем его составляющую из исходного (вычитаем)
Xandr (2006-02-27 16:51:00) [18]Э...
любой вектор можно разложить на сумму 2х перпендикулярных (причём они могут быть и не параллельны осям координат). так вот, отсечь значит: найти составляющий вектор параллельный данному отрезку.
если перефразировать, то:
даны координаты конечных точек гипотенузы и длинны катетов. Найти координаты третьей точки треугольника.
XProger (2006-02-26 21:59:00) [19]Перпендикуляр к ветору = (-Y, X)
Что значит отсечь?
Xandr (2006-02-26 21:22:00) [20]Математика...
как отсечь от вектора одну из его состовляющих, перпендикулярную к.л. отрезку?