Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Вниз

Как найти расстояние от точки до эллипса?   Найти похожие ветки 

 
Дмитрий Белькевич   (2003-08-04 04:06) [0]

Единственное, что похожее нашел - spicelib. В ней есть поиск ближайшей точки на эллипсе по отношению к заданной точке. Но исходников либы я не нвшел. Подскажите плиз как решить сабжевую задачу. Исходники на pas/fortran/c/java etc приветствуются.


 
default   (2003-08-04 04:45) [1]

как я понимаю - расстояния от точки до эллипса - это длина наикратчайшего расстояния от точки до "ободка" эллипса?


 
default   (2003-08-04 05:04) [2]

с заданой точностью можно найти это расстояния
нужно знать формулу эллипса
и пробегая с заданым шагом(это и будет точностью в данном случае)
по точкам "ободка" эллипса вычислять по теореме Пифагора расстояния от текущей точки "ободка" эллипса до заданной
и искать минимум этого расстояния - это и будет искомым расстоянием


 
Думкин   (2003-08-04 05:37) [3]

> Дмитрий Белькевич (04.08.03 04:06)
Эллипс легко параметризуется.
Строишь функцию расстояния от точки до эллипса - ищешь экстремумы - их 2. Соответственно одна реализует минимальное, а другая максимальное расстояние. Полученные формулы ложишь на Паскаль.


 
default   (2003-08-04 07:16) [4]


function GetDistEllipseToPoint(el_Width, el_Height, el_center_X,
( Word) [4]

function GetDistEllipseToPoint(el_Width, el_Height, el_center_X,
el_center_Y: Word; P: TPoint): Word;
var
i, y: Integer;
FConst, Res: Word;
SConst: Real;
begin

Result := High(Word);
FConst := Sqr(el_Height div 2);
SConst := FConst / Sqr(el_Width div 2);
for i := -(el_Width div 2) to el_Width div 2 do begin
y := Round(Sqrt(FConst - SConst * Sqr(i)));
if P.Y > el_Center_Y then y := -y;
Res := Round(Sqrt(Sqr(i - P.X + el_Center_X) + Sqr(y - el_Center_Y + P.Y)));
if Res < Result then Result := Res;
end;

end;


 
Дмитрий Белькевич   (2003-08-04 12:29) [5]

Всем большое спасибо, default"у особенно. Посмотрю, что их этого получится.


 
Дмитрий Белькевич   (2003-08-04 12:29) [6]

Всем большое спасибо, default"у особенно. Посмотрю, что из этого получится.


 
default   (2003-08-05 16:51) [7]

вот чуть получше

function GetDistEllipseToPoint(el_Width, el_Height, el_center_X,
( Word) [7]
вот чуть получше

function GetDistEllipseToPoint(el_Width, el_Height, el_center_X,
el_center_Y: Word; P: TPoint): Word;
var
i, y, StPos, EndPos: Integer;
FConst, Res: Word;
SConst: Real;
begin

Result := High(Word);
FConst := Sqr(el_Height div 2);
SConst := FConst / Sqr(el_Width div 2);
if P.X > el_center_X then begin
StPos := 0;
EndPos := el_Width div 2;
end else begin
StPos := -(el_Width div 2);
EndPos := 0;
end;
for i := StPos to EndPos do begin
y := Round(Sqrt(FConst - SConst * Sqr(i)));
if P.Y > el_Center_Y then y := -y;
Res := Round(Sqrt(Sqr(i - P.X + el_Center_X) + Sqr(y - el_Center_Y + P.Y)));
if Res < Result then Result := Res;
end;

end;

инета не было сразу написать...


 
Дмитрий Белькевич   (2003-08-06 02:25) [8]

Для default: Как это работает? Как я понял, ты вычисляешь некоторые точки эллипса, затем ищешь расстояние до каждой из них, и находишь минимальное расстояние?

Для Думкина:
> Эллипс легко параметризуется.

x=а·cost ,
y=в·sint , t от 0 до 2p

Оно?

> Строишь функцию расстояния от точки до эллипса - ищешь экстремумы - их 2.

Т.е. сделать то, что сделал default? Без перебора и без циклов совсем никак?

p.s. для default: всё хотел спросить, в чем смысл строки result := high(word) ?


 
default   (2003-08-07 13:29) [9]

Дмитрий Белькевич (06.08.03 02:25)
"всё хотел спросить, в чем смысл строки result := high(word)"
просто макс-ое значение для типа Word присв-ся
это сделано для срав-ия "if Res < Result then Result := Res;"
на счёт того как работает? очень просто
как ты и сказал - ищется минимум, поиск идёт в точках четверти эллипса
согласись если координата по Y точки лежит ниже гориз-ой оси эллипса, то не зачем перебирать точки нижней половины эллипса и с осью X та же история, таким образом поиск ведётся только по точкам половины ширины эллипса
а так используется формула эллипса и теорема Пифагора
FConst и SConst - это константы введённые, чтобы не считать в каждой итерации цикла эти выражения(они постоянны)эта такая маленькая оптимизация
вот вроде и всё



 
default   (2003-08-07 13:36) [10]

Дмитрий Белькевич (06.08.03 02:25)
"всё хотел спросить, в чем смысл строки result := high(word)"
просто макс-ое значение для типа Word присв-ся
это сделано для срав-ия "if Res < Result then Result := Res;"
на счёт того как работает? очень просто
как ты и сказал - ищется минимум, поиск идёт в точках четверти эллипса
согласись если координата по Y точки лежит ниже гориз-ой оси эллипса, то незачем перебирать точки ВЕРХНЕЙ половины эллипса и с осью X та же история, таким образом поиск ведётся только по точкам половины ширины эллипса
а так используется формула эллипса и теорема Пифагора
FConst и SConst - это константы введённые, чтобы не считать в каждой итерации цикла эти выражения(они постоянны)эта такая маленькая оптимизация
вот вроде и всё
P.S. при отладке этой функции я смотрел как визуально всё выглядит - то есть всё ok


 
Дмитрий Белькевич   (2003-08-09 03:11) [11]

8() во блин, я обычно maxbyte / maxword / maxint пользую.
Спасибо за обьяснения.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.02.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.043 c
14-80204
Hkr
2004-01-29 10:48
2004.02.25
Автозагрузка


14-80243
Soft
2004-02-04 17:55
2004.02.25
Microsoft запатентовал работу с XML.


3-79624
HolyMan
2004-02-01 21:55
2004.02.25
Где можно найти какую нибудь документацию к IBExpert у?


1-79735
h0use
2004-01-23 13:08
2004.02.25
Соответсвие индекса и названия языка в Language Info в заголовке


3-79655
xxxx
2004-01-30 16:25
2004.02.25
View vs Table





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский