Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
15-1166473407
std112
2006-12-18 23:23
2007.01.07
Microsoft Visual Studio .NET VC7


2-1165259127
Sewix
2006-12-04 22:05
2007.01.07
Отображение в dbgrid таблиц из разных БД


2-1166456508
sat
2006-12-18 18:41
2007.01.07
как свернуть программу в системный трей


2-1166371759
sinus
2006-12-17 19:09
2007.01.07
рисование иконки в Statusbar


2-1166099857
hgd
2006-12-14 15:37
2007.01.07
Подскажите





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский