Форум: "Игры";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
Внизещё раз о столкновении Найти похожие ветки
← →
Xandr © (2006-02-25 20:31) [0]суть:
есть непроходимые тайлы их нужно заменить линиями.
есть существа, их нужно заменить кругами.
вот в чём проблема: как лучше организовать замену, и САМОЕ главное - как проверить пересеклись ли окружность и кривая?
ЗЫ к математике не отправлять, уравнения прямых и окружностей я знаю, и умею решать системы уравнений. (правда на бумаге)
← →
XProger © (2006-02-25 20:45) [1]Как представлена кривая?
← →
Xandr © (2006-02-25 21:30) [2]ну в этом то и трабл...
скорее всего как такая изогнутая линия с неравномерными по всей её длинне фрустациями :D
на самом деле я опечатался.
нужно проверить пересечение ПРЯМОЙ и окружности...
но думаю вопрос по представлению не отпадает?
Я НЕ ЗНАЮ!
вы что посоветуете?
можете говорить всё что угодно, проэкт только начался, и находится на стадии рисования тайлов и обдумывания глобальных принципов взаимодействия.
← →
XProger © (2006-02-25 21:35) [3]Найди расстояние от центра окружности до прямой, если меньше радиуса окружности - пересечение.
http://algolist.manual.ru/maths/geom/distance/pointline.php
← →
Xandr © (2006-02-26 05:04) [4]сенкс!
← →
Xandr © (2006-02-26 17:07) [5]webfile.ru/830792 (~4 Кило)
немного офтоп...
блин начал делать, а тут такая фигня:
круг должен двигаться в то место, где нажата мышка, а на самом деле... :)
там 2 формулы у меня, ни с одной не получается...
вобщем посмотрите, плиз если не трудно.
← →
Xandr © (2006-02-26 17:24) [6]XProger Я ЗНАЮ ТЫ ТУТ!
ПОМОГИИИИИИИИ!
← →
XProger © (2006-02-26 18:14) [7]:)
procedure TForm1.DXDraw1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
a: real;
begin
mx:=x;
my:=y;
if not edit then
begin
a := sqrt(sqr(px - mx) + sqr(py - my));
if a <> 0 then
begin
pdx := -(px - mx)/a * 3;
pdy := -(py - my)/a * 3;
end else
begin
pdx := 0;
pdy := 0;
end;
end;
end;
← →
XProger © (2006-02-26 18:20) [8]Вообще, у тебя там жуткие погрешности возникают из-за
px:=trunc(px+pdx);
py:=trunc(py+pdy);
← →
Xandr © (2006-02-26 18:29) [9]спасибо!
вот теперь вопрос:
1. почему то, что было не работало?
2. тебе не западло отвечать всяким неучам на их тупые вопросы?
ЗЫ последний вопрос - ко Всем!
← →
Xandr © (2006-02-26 18:30) [10]
> Вообще, у тебя там жуткие погрешности возникают из-за
> px:=trunc(px+pdx);
> py:=trunc(py+pdy);
я знаю!
как без этого?
← →
XProger © (2006-02-26 18:31) [11]Xandr,
1) намудрил ты там что-то с тригонометрией %) Я даже разбираться не стал...
2) Как видишь...
← →
XProger © (2006-02-26 18:33) [12]Xandr,
px, py : Single;
...
px := px + pdx;
py := py + pdy;
А вот при отрисовке - передавай trunc(px) и trunc(py)
← →
Xandr © (2006-02-26 18:39) [13]
> 1) намудрил ты там что-то с тригонометрией %) Я даже разбираться
> не стал...
ну это всё ещё из школы...
а вообще я такие вот в точности формулы видел во многих примерах...
а идея кстати прикольная (про длинну вектора и последующем делении на неё составляющих ускорения)...
← →
Xandr © (2006-02-26 21:22) [14]Математика...
как отсечь от вектора одну из его состовляющих, перпендикулярную к.л. отрезку?
← →
XProger © (2006-02-26 21:59) [15]Перпендикуляр к ветору = (-Y, X)
Что значит отсечь?
← →
Xandr © (2006-02-27 16:51) [16]Э...
любой вектор можно разложить на сумму 2х перпендикулярных (причём они могут быть и не параллельны осям координат). так вот, отсечь значит: найти составляющий вектор параллельный данному отрезку.
если перефразировать, то:
даны координаты конечных точек гипотенузы и длинны катетов. Найти координаты третьей точки треугольника.
← →
A22 © (2006-02-27 19:11) [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 19:43) [18]
> Перпендикуляр к ветору = (-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);
и такую фигню мне рисуют! :)
что не так?
← →
XProger © (2006-02-28 16:43) [19]
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-28 19:57) [20]угу.
уже сам допёр.
но всё равно спасибо.
Блин.
вот тут пытаюсь написать простейшую CAD систему (для движка), запарился на самом простом: колизии отрезка с окружностью. (корее всего опять перемудрил там чё-то)
есть у кого нибудь ссылочки, где можно почитать по этому поводу что-нибудь (хотябы общие принципы)?
если это важно то "игра" - изометрическая проэ(е?)кция.
← →
XProger © (2006-02-28 21:42) [21]XProger © (25.02.06 21:35) [3]
Найди расстояние от центра окружности до прямой, если меньше радиуса окружности - пересечение.
http://algolist.manual.ru/maths/geom/distance/pointline.php
← →
Xandr © (2006-03-01 19:31) [22]ну, я опять не то сказал...
пишу ночью, вот и туплю :)
с коллизиями всё как раз в порядке.
дело в другом: мне нужно чтобы окружность при столкновении с отрезком, продолжала двигаться вдоль него в направлении, наиболее близком к указываемой точке. При столкновении с самим отрезком, я это реализовал (вычитанием из вектора направления одну из его состовляющих, перпендикулярную отрезку {**}). :)
проблема возникла с концами отрезка :)))
т.е. если окружность находится напротив конца отрезка, а вектор направления походит ~ вдоль него, то такой алгоритм (**) не работает! :(
← →
XProger © (2006-03-01 19:41) [23]Пересечение точки с окружностью, а куда отталкивать - нарисуй на листочке - поймёшь (связано с направлением скорости перемещения окружности)
← →
Xandr © (2006-03-01 20:31) [24]вот родился из коленки алгоритм:
-опускаем от прямой, содержащей отрезок, перпендикуляр на точу направления. (вектор а)
-новое направление = положение круга + вектор ист. направления + вектор а.
вот вопросы:
1.будет ли сие работать?
2.Ну НАВЕРНЯКА уже есть готовые алгоритмы решения этой задачи (или нет?)
3.Можно ли зделать проще?
← →
XProger © (2006-03-01 20:53) [25]Можно иначе. Проводим вектор (V) от точки отрезка до центра окружности. Находим его длину (R). Если она меньше Radius окружности - идём дальше. Нормализуем его (V -> N). Затем производим сдвиг центра окружности на N * (Radius - R). Не исключены случаи, когда окружность будет "колбасить" в определённых ситуациях.
← →
Xandr © (2006-03-01 21:07) [26]XProger,
а нормализовать это что типа этого:
Result.X := с.X / Lenght;
Result.Y := с.Y / Lenght; (?)
Помоему у тебя же и подсмотрел...
← →
Xandr © (2006-03-01 21:13) [27]кстати извиняюсь за фамильярничество, если это вдруг кого задело!
по поводу [25]:
насколько я понял это что - то типа отталкивающего поля получается, да?
← →
XProger © (2006-03-01 21:19) [28]Типа :)
← →
Xandr © (2006-03-01 21:25) [29]а по поводу [26]?
← →
XProger © (2006-03-01 22:02) [30]да
← →
Xandr © (2006-03-02 17:11) [31]Удалено модератором
← →
Xandr © (2006-03-02 18:04) [32]Вооот, а теперь не подскажете ли, алгоритм коллизий окружности и прямоугольника?
← →
Xandr © (2006-03-03 12:31) [33]вот: webfile.ru/840296 (~192K)
у меня там 2 окружности. одной управляет польз-тель, другая статичная (её можно передвигать "толкая" управляемой.
Все вроде хорошо, но только иногда возникают ситуации, когда неуправляемая окружность наталкивается на линию, управляемая "наезжает" на неё.
никак не пойму в чём дело. хелп если не лень.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.011 c