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

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

Определить, является ли многоугольник выпуклым? [D7, XP]


IPranker ©   (2011-01-16 21:17:00) 

Алгоритм нашёл тут:
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:49:00) [1]

Удалено модератором


IPranker   (2011-01-16 21:49:00) [2]

Подправил:


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;


IPranker   (2011-01-16 21:43:00) [3]

Удалено модератором


Palladin   (2011-01-16 21:40:00) [4]

он пашет только с 1 до 10 числа, кроме четвергов, каждого четного месяца по календарю викингов


Наверх

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