Текущий архив: 2011.04.17;
Скачать: CL | DM;
ВнизОпределить, является ли многоугольник выпуклым? Найти похожие ветки
← →
IPranker © (2011-01-16 21:17) [0]Алгоритм нашёл тут:
http://algolist.manual.ru/maths/geom/polygon/convex_or.php
Перевёл так:
Function IsConvexPolygon(const Pts: array of TPoint): boolean;
Var
i, Num: LongWord;
p1, p2: LongWord;
z : LongInt;
Flag: LongInt;
begin
Num:= (High(Pts) + 1);
If (Num < 4) then
begin
Result:= False;
Exit;
end;
Flag:= 0;
For i:= 0 to Num - 1 do
begin
p1:= (i + 1) mod Num;
p2:= (i + 2) mod Num;
z:= (Pts[p1].X - Pts[i].X) * (Pts[p2].Y - Pts[p1].Y);
z:= z - (Pts[p1].Y - Pts[i].Y) * (Pts[p2].X - Pts[p1].X);
If (z < 0) then Flag:= Flag or 1
else
If (z > 0) then Flag:= Flag or 2
else
If (Flag = 3) then
begin
Result:= True;
Exit;
end;
end;
Result:= (Flag <> 0);
End;
Но не пашет. Почему?
← →
Palladin © (2011-01-16 21:40) [1]он пашет только с 1 до 10 числа, кроме четвергов, каждого четного месяца по календарю викингов
← →
IPranker © (2011-01-16 21:43) [2]Удалено модератором
← →
Palladin © (2011-01-16 21:49) [3]Удалено модератором
← →
IPranker © (2011-01-16 21:49) [4]Подправил:
Function IsConvexPolygon(const Pts: array of TPoint): boolean;
Var
i, Num: LongWord;
p1, p2: LongWord;
z : LongInt;
Flag: LongInt;
begin
Num:= (High(Pts) + 1);
If (Num < 4) then // Треугольники и проч.
begin
Result:= (Num = 3);
Exit;
end;
Flag:= 0;
For i:= 0 to Num - 1 do
begin
p1:= (i + 1) mod Num;
p2:= (i + 2) mod Num;
z:= (Pts[p1].X - Pts[i].X) * (Pts[p2].Y - Pts[p1].Y);
z:= z - (Pts[p1].Y - Pts[i].Y) * (Pts[p2].X - Pts[p1].X);
If (z < 0) then Flag:= Flag or 1
else
If (z > 0) then Flag:= Flag or 2;
If (Flag = 3) then
begin
Result:= True;
Exit;
end;
end;
Result:= (Flag <> 0);
End;
Страницы: 1 вся ветка
Текущий архив: 2011.04.17;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.003 c