Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.47 MB
Время: 0.01 c
15-1294148572
alexdn_
2011-01-04 16:42
2011.04.17
c++


2-1294828261
Студент
2011-01-12 13:31
2011.04.17
Насколько я неправильно использую SetLength?


15-1294066387
KilkennyCat
2011-01-03 17:53
2011.04.17
В разделе "начинающим" есть про акустический резонанс.


1-1252408144
bratel
2009-09-08 15:09
2011.04.17
на компе не работают программы на дельфи


15-1294090199
Юрий
2011-01-04 00:29
2011.04.17
С днем рождения ! 4 января 2011 вторник