Форум: "Игры";
Текущий архив: 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.03 c