компьютерный форум
Вернуться   Компьютерный форум > Программирование и вебстроительство > Программирование

Ответ
 
LinkBack Опции темы Опции просмотра
Старый 25.11.2004, 09:17   #1
Гость
Guest
 
Сообщений: n/a
Angry

Имеется программа, проверяющая принадлежит ли многоугольнику точка. Никак не могу понять алгоритм работы функции PointInSidebar (она возвращает true есили точка принадлежит и false если не принадлежит многоугольнику).
Arr - массив исходных точек, Check1 - какая - либо другая точка.
Подскажите....
Код:
Type
 *TPoint =
 * *Record
 * * *X, Y: Integer;
 * *End;

Function PointInSidebar(Const SideBar: Array Of TPoint;
 * * * * p: TPoint; Count: Integer): Boolean;
 *Var
 * *x1,y1,x2,y2: Double;
 * *x0, y0, sum, divisor: Double;
 * *i: integer;
 *Begin
 * *sum := 0;
 * *y0 := p.y;
 * *x0 := p.x;
 * *For i := 0 to Pred(count-1) do
 * * *Begin
 * * * *x1:=sidebar[i].x;
 * * * *y1:=sidebar[i].y;
 * * * *x2:=sidebar[i+1].x;
 * * * *y2:=sidebar[i+1].y;

 * * * *divisor:=y1*x2-x1*y2-y0*x2+y0*x1+x0*y2-x0*y1;
 * * * *divisor := divisor + 1.0E-10;

 * * * *Sum := sum + (
 * * * *-arctan( (-x2*x1+x1*x0+y0*y1-x2*x0+x2*x2-y2*y0+y2*y2-y1*y2 )/divisor)+
 * * * *arctan( (-x1*x1+x2*x1+x1*x0+y0*y1+y1*y2-x2*x0-y1*y1-y2*y0 )/divisor)
 * * * *);
 * * *End;

 * *x1:=sidebar[count-1].x;
 * *y1:=sidebar[count-1].y;
 * *x2:=sidebar[0].x;
 * *y2:=sidebar[0].y;

 * *divisor:=y1*x2-x1*y2-y0*x2+y0*x1+x0*y2-x0*y1;
 * *divisor := divisor + 1.0E-10;
 * *Sum := sum + (
 * *-arctan((-x2*x1+x1*x0+y0*y1-x2*x0+x2*x2-y2*y0+y2*y2-y1*y2)/divisor)+
 * *arctan((-x1*x1+x2*x1+x1*x0+y0*y1+y1*y2-x2*x0-y1*y1-y2*y0)/divisor)
 * *);

 * *pointinsidebar := not (abs(Sum) < 0.0001)
 *End;

Const
 *arr: Array[0 .. 3] Of TPoint =
 * *(*
 * *( {First}
 * * *(X:3;Y:3),
 * * *(X:7;Y:10),
 * * *(X:12;Y:6),
 * * *(X:9;Y:7)
 * *);
 * **)
 * *(*
 * *(
 * * *(X:12;Y:8),
 * * *(X:17;Y:14),
 * * *(X:17;Y:11),
 * * *(X:21;Y:7)
 * *);
 * **)
 * *(
 * * *(X:1;Y:2),
 * * *(X:1;Y:4),
 * * *(X:3;Y:4),
 * * *(X:3;Y:2)
 * *);

Const
 *(* {First}
 *Check1: TPoint = (X:4; Y:8);
 *Check2: TPoint = (X:7; Y:8);
 *Check3: TPoint = (X:7; Y:5);
 *Check4: TPoint = (X:9; Y:5);
 **)

 *(* {Second}
 *Check1: TPoint = (X:13; Y:12);
 *Check2: TPoint = (X:16; Y:10);
 *Check3: TPoint = (X:18; Y:11);
 *Check4: TPoint = (X:19; Y:8);
 **)
 *Check1: TPoint = (X:1; Y:3);

Var
 *b: Boolean;
Begin
 *b := PointInSidebar(arr, Check1, 4);
 *{
 *b := PointInSidebar(arr, Check2, 4);
 *b := PointInSidebar(arr, Check3, 4);
 *b := PointInSidebar(arr, Check4, 4);
 *}
End.




 
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
25.11.2004, 09:17
Техник
реклама
Angry

Старый 26.11.2004, 00:06   #2
Пользователи
 
Регистрация: 11.10.2004
Сообщений: 607
По умолчанию

2 Гость
Программа основывается на формуле разложения многоугольника в ряд. (причем ряд ограниченный количеством вершин многоугольника)
А какая точно форму мне не известно
Хотя я дома учебник гляну, может че происнится. Давно я такие вещи не писал :P
BooMeR вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 26.11.2004, 14:18   #3
Гость
Guest
 
Сообщений: n/a
По умолчанию

Я думал, здесь считаются углы отклонения (через функцию arctan). Но сам способ чего-то не очень понятен
 
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.



Текущее время: 09:15. Часовой пояс GMT.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Content Relevant URLs by vBSEO 3.5.0 RC2