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 }
![]()