首页 新闻 会员 周边

我在坐标系中画一个多边形,如果判断给定的点是否在图形内呢?

3
悬赏园豆:200 [已解决问题] 解决于 2015-12-25 08:46

把问题抽象一下:

有一个坐标系,我们可以用鼠标在地图上画点,然后根据点的顺序,就生成了一个多边形,

目前有一个需求是有一些点,要拿出落在这个图形里面的点,该怎么判断呢?

不能确定用户会画出什么样的图形来。规规矩矩的那种类似矩形的倒是很好实现。

但是也有这样的:

之奇一昂的主页 之奇一昂 | 小虾三级 | 园豆:1421
提问于:2015-12-23 16:07
< >
分享
最佳答案
0

http://stackoverflow.com/questions/217578/how-can-i-determine-whether-a-2d-point-is-within-a-polygon

收获园豆:95
羽商宫 | 老鸟四级 |园豆:2490 | 2015-12-24 10:03
其他回答(3)
0

你这个是凹多边形的。凸多边形的我倒是有想法。

图形内的任意一点,然后按照图形边的同一方向。这个点都在所有图形边的同一侧。(好像只适用于凸多边形的。)

帮你顶了一下问题。

收获园豆:20
[0] | 园豆:1257 (小虾三级) | 2015-12-23 16:18

谢谢,之前没有做过图形相关的东西,真费脑子啊

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-12-23 16:36
0

GDI里面我记得有个函数叫PtInRegion的API,不知道有没用

收获园豆:5
灰色逻辑 | 园豆:292 (菜鸟二级) | 2015-12-23 16:53
0
 1 public boolean isInPolygon(Point point, Point[] points) {
 2     int nCross = 0;
 3      int n=points.Length;
 4     for (int i = 0; i < n; i++) {
 5       Point p1 = points[i];
 6       Point p2 = points[(i + 1) % n];
 7       // 求解 y=p.y 与 p1 p2 的交点
 8       // p1p2 与 y=p0.y平行
 9       if (p1.y == p2.y)
10         continue;
11       // 交点在p1p2延长线上
12       if (point.y < Math.min(p1.y, p2.y))
13         continue;
14       // 交点在p1p2延长线上
15       if (point.y >= Math.max(p1.y, p2.y))
16         continue;
17       // 求交点的 X 坐标
18       double x = (double) (point.y - p1.y) * (double) (p2.x - p1.x)
19           / (double) (p2.y - p1.y) + p1.x;
20       // 只统计单边交点
21       if (x > point.x)
22         nCross++;
23     }
24     return (nCross % 2 == 1);
25   }

拿去吧~~~~

收获园豆:80
ensleep | 园豆:1682 (小虾三级) | 2015-12-23 17:00

请问能再详细讲一下吗?我这里需要把图形条件处理一下成SQL去数据库查,尽量把一个图形抽象成各种条件

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-12-24 10:23

@之奇一昂: point是你要算的那个点的坐标,point[]是多边形各种顶点的坐标,不过要保证是有序的,就是说,你绘制这个多边形时笔触经过各顶点的先后顺序。

支持(0) 反对(0) ensleep | 园豆:1682 (小虾三级) | 2015-12-24 14:29

@ensleep: 看你这解释,感觉代码不是你写的一样。我希望你能解释一下,为什么这样写,这个程序背后支持这个算法的数学原理方面的?

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-12-25 08:07

@ensleep: 从测试点到图形外面发射线,查交点的个数?

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-12-25 08:44

@之奇一昂: 还有比代码更清楚的解释???就25行的代码,大哥,你让我一句一句给你讲语法么?

支持(0) 反对(0) ensleep | 园豆:1682 (小虾三级) | 2015-12-25 09:11

@之奇一昂: 你是面视官?我是来面试的?

支持(0) 反对(0) ensleep | 园豆:1682 (小虾三级) | 2015-12-25 09:12

@ensleep: 不好意思,我对你要求太高了,对不起!

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-12-25 09:25

@ensleep: 

float InvSqrt(float x)
{
    float xhalf = 0.5f*x;
    int i = *(int*)&x; // get bits for floating VALUE 
    i = 0x5f375a86- (i>>1); // gives initial guess y0
    x = *(float*)&i; // convert bits BACK to float
    x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
    x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
    x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
    return 1/x;
}

像这段代码,如果不知道牛顿迭代法,根本看不懂,比25行还少

支持(0) 反对(0) 之奇一昂 | 园豆:1421 (小虾三级) | 2015-12-25 09:30

@之奇一昂: 后面不是有注释了,我看它有注释,而且是可用的,直接给你了。

支持(0) 反对(0) ensleep | 园豆:1682 (小虾三级) | 2015-12-25 09:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册