1 /* 原理: 將測試點的Y坐標與多邊形的每一個點進行比較, 2 ** 會得到測試點所在的行與多邊形邊的所有交點。 3 ** 如果測試點的兩邊點的個數都是奇數個, 4 ** 則該測試點在多邊形內,否則在多邊形外。 */ 5 #include <stdio.h> 6 #include <iostream> 7 /* 函數功能: 判斷點(x, y)是否在有ploy_sides個頂點的多邊形內 */ 8 /* 參數: poly_sides 測試多邊形的頂點數 9 ** poly_x 測試多邊形的各個頂點的X軸坐標 10 ** poly_y 測試多邊形的各個頂點的Y軸坐標 11 ** x 測試點的X軸坐標 12 ** Y 測試點的Y軸坐標 */ 13 /* 返回值: 返回0 表示不在多邊形內部,返回1 表示在多邊形內部 */ 14 /* 說明: 在多邊形各邊上的點默認不在多邊形內部 */ 15 int inOrNot(int poly_sides, float *poly_X, float *poly_Y, float x, float y) 16 { 17 int i, j; 18 j = poly_sides - 1; 19 int res = 0; 20 for (i = 0; i<poly_sides; i++) 21 { 22 //對每一條邊進行遍歷,該邊的兩個端點,有一個必須在待檢測點(x,y)的左邊,且兩個點中,有一個點的y左邊比p.y小,另一個點的y比p.y大。 23 if ((poly_Y[i]<y && poly_Y[j] >= y || poly_Y[j]<y && poly_Y[i] >= y) && (poly_X[i] <= x || poly_X[j] <= x)) 24 { 25 //用水平的直線與該邊相交,求交點的x坐標。 26 res ^= ((poly_X[i] + (y - poly_Y[i]) / (poly_Y[j] - poly_Y[i])*(poly_X[j] - poly_X[i])) < x); 27 } 28 j = i; 29 } 30 return res; 31 } 32 33 int main(void) 34 { 35 int poly_sides = 5; // 多邊形頂點數 36 float poly_X[5] = { 1, 1, 3, 4, 3 }; // 多邊形各頂點的X軸坐標 37 float poly_Y[5] = { 1, 2, 3, 2, 1 }; // 多邊形各頂點的Y軸坐標 38 float x = 399; // 測試點的X軸坐標 39 float y = 2; // 測試點的Y軸坐標 40 int ret; 41 ret = inOrNot(poly_sides, poly_X, poly_Y, x, y); 42 if (1 == ret) 43 { 44 printf("the point (%f, %f), in the poly\n", x, y); 45 } 46 else 47 { 48 printf("the point (%f, %f), not in the poly\n", x, y); 49 } 50 system("pause"); 51 return 0; 52 }