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

Вниз

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

 
Дмитрий Белькевич   (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
3-79603
Крутыш
2004-02-01 17:22
2004.02.25
Access в сети


1-79834
karburator
2004-02-10 11:05
2004.02.25
Как узнать путь к программе из запущенного ею потока?


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


1-79815
Romba
2004-02-11 10:37
2004.02.25
Как в ToolBar сделать чтобы некоторые кнопки были всегда в конце?


14-80232
dr Tr0jan
2004-02-02 07:28
2004.02.25
Чат без основного сервера!