![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SearchingPoint [D7, XP]
FASe © (2006-08-09 15:04:00)Здравствуйте. Подскажите (или поправьте мой) алгоритм поиска ближайшей точки. Т.е. есть массив точек Point: TPoint;
Нужно взять некую точку из массива и найти самую ближнюю к ней, я делаю так, но невсегда правильно находит.
var
Point: array of TPoint;
function FindPoint(const NP: Integer): Integer;
var X, Y, N, FoundN: Integer;
begin
X:=Width; Y:=Height; Result:=-1;
for N:=HIGH(Point) downto 0 do begin
if (N<>NP) and ((ABS(Point[NP].X-Point[N].X)<X) and (ABS(Point[NP].Y-Point[N].Y)<Y)) then begin
X:=ABS(Point[NP].X-Point[N].X);
Y:=ABS(Point[NP].Y-Point[N].Y);
Result:=N;
end;
end;
end;
procedure ButtonClick(Send...);
var N, FN: Integer;
begin
SetLength(Point, 100);
for N:=0 to 100 do begin
Point[N].X:=Random(Width);
Point[N].Y:=Random(Height);
end;
FN:=FindPoint(30);
if FN>=0 then ShowMessage(Format('У точки с № %d самая ближняя точка с № %d',[30, FN])
else ShowMessage('Не найдено');
end;
FASe (2006-08-09 20:10:00) [1]> [9] Leonid Troyanovsky © (09.08.06 18:49)
> Это зависит от метрического пространства, в котором оные
> точки расположены.
> Для евклидова - метрика квадратичная, т.е. см, например
> [2].
Блин, это прямо матом для меня ругаетесь. :)))
Как все запущено.... у меня имею ввиду.
FASe (2006-08-09 20:07:00) [2]> [7] novill © (09.08.06 15:53)
Извеняюсь, невнимательно прочитал...Ну расстреляйте меня за это...:)
SQR - это же квадрат числа...
Усек. Спасибо большое, с Вашими намеками вкурил в чем дело.
> [9] Leonid Troyanovsky © (09.08.06 18:49)
Да, спасибо, способ от MBo решил проблему.
Сенькс всем откликнувшимся.
FASe (2006-08-09 18:56:00) [3]> [8] Сергей М. © (09.08.06 15:57)
К большому сожалению ДА. :(
Для меня, в принципе, всегда тяжела была геометрия... А тут столько лет...
Вообще все забыл.
> [7] novill © (09.08.06 15:53)
В чем прикол?...
Извеняюсь, может не совсем понял...
А типа -2.345 х 3.564= -8,35758 или не так?
Да это и не по теме вроде бы.
СПАСИБО и на этом, сейчас попробую то, что, предложил MBo (09.08.06 15:10)
Отдельное спасибо MBo.
Leonid Troyanovsky (2006-08-09 18:49:00) [4]
> FASe (09.08.06 15:28) [3]
> Спасибо попробую, а ABS надо делать или без него вычислит?
Это зависит от метрического пространства, в котором оные
точки расположены.
Для евклидова - метрика квадратичная, т.е. см, например [2].
Как зовут пр-во с метрикой abs даже и не вспомню :)
См. также топология, функциональный анализ &etc
--
Regards, LVT.
Сергей М. (2006-08-09 15:57:00) [5]
> только давно это было... подзабыл все
Неужели забыл и азы - квадрат гипотенузы равен сумме квадратов катетов ?!)
novill (2006-08-09 15:53:00) [6]Хмм, вроде не первое апреля. :-|
Попробуй перемножить лубое вещественное число само на себя и получить отрицательное число.
FASe (2006-08-09 15:47:00) [7]
> Сергей М. © (09.08.06 15:31) [4]
> из курса тригонометрии начальной школы)... Не приходилось ее посещать разве ?)
Приходилось.... только давно это было... подзабыл все. :((
> novill © (09.08.06 15:32) [5]
> Есть еще такая наука алгебра.
>
> Не встречалась?
>
> Зачем брать модуль от числа возводимого в квадрат?????
Есть альтернатива? Можно поподробней....
Блин и алгебру забываю.... :((
Спасибо.
novill (2006-08-09 15:32:00) [8]Есть еще такая наука алгебра.
Не встречалась?
Зачем брать модуль от мисла возводимого в квадрат?????
Сергей М. (2006-08-09 15:31:00) [9]
> Если бы был достаточно хорошо знаком, то сдесь не спрашивал
> бы
Это же сведения из курса тригонометрии начальной школы) ... Не приходилось ее посещать разве ?)
FASe (2006-08-09 15:28:00) [10]
> Сергей М. © (09.08.06 15:08) [1]
Если бы был достаточно хорошо знаком, то сдесь не спрашивал бы.
> MBo © (09.08.06 15:10) [2]
Спасибо попробую, а ABS надо делать или без него вычислит?
т.е. NewDist := Sqr( ABS(Point[NP].X-Point[N].X)) + Sqr( ABS(Point[NP].Y-Point[N].Y));
?
MBo (2006-08-09 15:10:00) [11]по теореме Пифагора:
MinDistSqr := 10e12;
...
NewDist := Sqr(Point[NP].X-Point[N].X) + Sqr(Point[NP].Y-Point[N].Y);
if NewDist < MinDistSqr then begin
MinDistSqr := NewDist;
Result := N;
end;
Сергей М. (2006-08-09 15:08:00) [12]Есть такая наука - геометрия ..
Знаком с ней хоть немного ?