Форум: "Потрепаться";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];
ВнизТочка в полигоне!!! Найти похожие ветки
← →
F1 (2002-12-15 13:27) [0]Недавно извращался, писал такую хрень, для узнавания находится ли точка в полигоне или нет... Может кому надо... Только немного доработать надо, а то на ноль полохо делится :)))
Type
TRealPoint = record
x:Real;
y:Real;
end;
PRealItem=^TRealItem;
TRealItem = record
X:Real;
Next:PRealItem;
end;
function PointInPoligon(Point:TRealPoint; Poligon:Array of TRealPoint; IndFirst,IndLast:Integer):Boolean;
var
Ind,Ind1:Integer;
FirstItem,Item,Item1:PRealItem;
x:Real;
C:Integer;
begin
FirstItem:=0;
C:=0;
for Ind:=IndFirst to IndLast do
begin
Ind1:=Ind+1;
if Ind1>IndLast then Ind1:=IndFirst;
if (Poligon[Ind].y-Point.y>0) xor (Poligon[Ind1].y-Point.y>0) then
begin
C:=C+1;
x:=(Poligon[Ind].x+(Poligon[Ind1].x-Poligon[Ind].x)*(Poligon[Ind].y-Point.y)/(Poligon[Ind].y-Poligon[Ind1].y));
if FirstItem=Nil then
begin
New(FirstItem);
FirstItem^.Next:=Nil;
FirstItem^.X:=x;
end else
begin
if x<FirstItem^.X then
begin
New(Item);
Item^.Next:=FirstItem;
Item^.X:=x;
FirstItem:=Item;
end else
begin
Item:=FirstItem;
while Item^.Next<>Nil do
if Item^.Next^.X > x then Break else Item:=Item^.Next;
New(Item1);
Item1^.X:=x;
Item1^.Next:=Item^.Next;
Item^.Next:=Item1;
end;
end;
end;
end;{For}
Result:=False;
Item:=FirstItem;
if FirstItem<>Nil then
repeat
if Point.x<Item^.X then
begin
Break;
end else
begin
Item:=Item^.Next;
Result:=Not Result;
end;
until Item = nil;
end;
← →
Romkin (2002-12-15 13:31) [1]Ой мама! а просто CreatePoligonRgn и потом PtInRegion?
← →
F1 (2002-12-15 13:34) [2]Romkin © (15.12.02 13:31)
Ой мама! а просто CreatePoligonRgn и потом PtInRegion?
Я же сказал, "извращался", геометрию вспоминал!!! :)))
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2003.01.02;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.003 c