Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

ещё раз о столкновении   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.046 c
15-1166210358
PHPDeveloper
2006-12-15 22:19
2007.01.07
органайзер


2-1166096159
Илюхха
2006-12-14 14:35
2007.01.07
Работа со ВСЕЙ оперативной памятью


9-1141242252
Artem_usb
2006-03-01 22:44
2007.01.07
RTS алгоритмы реальных игр


15-1166217571
MegaNop
2006-12-16 00:19
2007.01.07
Надоело MainMenu!


2-1166260979
VitV
2006-12-16 12:22
2007.01.07
Использование DLL созданных в Дэлфи в VC