判斷一個點在多邊形的內部C++


 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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM