====== بررسی داخل بودن نقطه در چند ضلعی ======
یکی از مسلههای مهم در زمینه الگوریتمهای هندسی و سایر مسایل مربوط به هندسه ترکیبیاتی ، مسله بررسی داخل بودن یک نقطه مانند $P$ در چند ضلعی ساده(چند ضلعی که اضلاعش همدیگر را قطع نمیکنند) $Q$ می باشد.یکی از روش های ساده برای حل این مسله رسم نیمخط دلخواهی مانند $\overrightarrow{Px}$ و بررسی تعداد نقاط تقاطع آن با اضلاع $Q$ است. در صورتی که این تعداد زوج باشد $P$ درون $Q$ قرار دارد و در صورتی که این تعداد فرد باشد $P$ بیرون $Q$ قرار دارد.اثبات این مطلب به عهده خواننده! .
===== پیچیدگی الگوریتم =====
مرتبه زمانی الگوریتم از$O(n)$ و حافظه مصرف شده از $O(1)$ میباشد.
===== پیادهسازی اولیه =====
#include
#define MIN(x,y) (x < y ? x : y)
#define MAX(x,y) (x > y ? x : y)
#define INSIDE 0
#define OUTSIDE 1
typedef struct {
double x,y;
} Point;
int InsidePolygon(Point *polygon,int N,Point p)
{
int counter = 0;
int i;
double xinters;
Point p1,p2;
p1 = polygon[0];
for (i=1;i<=N;i++) {
p2 = polygon[i % N];
if (p.y > MIN(p1.y,p2.y)) {
if (p.y <= MAX(p1.y,p2.y)) {
if (p.x <= MAX(p1.x,p2.x)) {
if (p1.y != p2.y) {
xinters = (p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;
if (p1.x == p2.x || p.x <= xinters)
counter++;
}
}
}
}
p1 = p2;
}
if (counter % 2 == 0)
return(OUTSIDE);
else
return(INSIDE);
}
===== پیادهسازی دیگر =====
در این روش حول نقطه $P$ تمام اضلاع را مشاهده کرده و همه زوایای بهدست آمده را به صورت جهت دار با هم جمع میزنیم.در صورتی مجموع $2\pi$ شود نقطه داخل چند ضلعی قرار دارد و در صورتی که مجموع $0$ شود نقطه خارج چندضلعی قرار دارد.
#include
typedef struct {
int h,v;
} Point;
int InsidePolygon(Point *polygon,int n,Point p)
{
int i;
double angle=0;
Point p1,p2;
for (i=0;i pi
*/
double Angle2D(double x1, double y1, double x2, double y2)
{
double dtheta,theta1,theta2;
theta1 = atan2(y1,x1);
theta2 = atan2(y2,x2);
dtheta = theta2 - theta1;
while (dtheta > PI)
dtheta -= TWOPI;
while (dtheta < -PI)
dtheta += TWOPI;
return(dtheta);
}
===== مراجع =====
- [[http://bbs.dartmouth.edu/~fangq/MATH/download/source/Determining%20if%20a%20point%20lies%20on%20the%20interior%20of%20a%20polygon.htm|پیاده سازی اولیه]]
----------------
- [[http://bbs.dartmouth.edu/~fangq/MATH/download/source/Determining%20if%20a%20point%20lies%20on%20the%20interior%20of%20a%20polygon.htm|پیاده سازی دیگر]]
----------------
خوانندهی گرامی، لطفا در صورت داشتن پیشنهاد یا مشاهدهی مشکل (علمی، تایپی و ...) در این صفحه، به ما اطلاع دهید:
~~DISCUSSION~~