Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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]

Есть такая наука - геометрия ..

Знаком с ней хоть немного ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо