北京家具展览会,华普超市电话,海魔方死人了
公司项目,要实现用户在矩形的红外图像上圈一块区域,计算该区域内部的平均温度、最大、最小温度,圈的区域有可能是矩形、椭圆、或者任意由多条线段构成的多边形,实现这个需求可以转换为求一个点是否在该几何图形内部,下面总结一下各种几何图形的判断方法。
1.矩形
判断点是否在矩形内,只要确定点的坐标在矩形四个顶点限定范围内即可
如上图,满足x<=x2&&x>x1&&y>y1&&y<y即可
2.椭圆
判断点是否在椭圆内,可以根据椭圆表达式求得
如上图,如果a>b,即焦点在x轴上,则满足(x*x/a/a+y*y/b/b < 1)的点在椭圆内,如果a<b,即焦点在y轴上,则满足(y*y/a/a+x*x/b/b<1)的点在椭圆内
3.由多个点构成的不规则图形
对于不规则图形,可以通过射线法判断,即计算射线与多边形各边的交点,如果是偶数,则点在多边形外,否则在多边形内
算法代码如下:
public bool contains(point test) { int i; int j; bool result = false; for (i = 0, j = _pointlist.count - 1; i < _pointlist.count; j = i++) { if ((_pointlist[i].y > test.y) != (_pointlist[j].y > test.y) && (test.x < (_pointlist[j].x - _pointlist[i].x) * (test.y - _pointlist[i].y) / (_pointlist[j].y - _pointlist[i].y) + _pointlist[i].x)) { result = !result; } } return result; }
要计算射线与线段的交叉,可以观察下图:
由上两条,可以推得,t点与线段相交的条件为: t.y<v2.y && t.y>v1.y && c.x<((t.y-v1.y)*(v2.x-v1.x)/(v2.y-v1.y)+v1.x)
接下来考虑一些特殊情况:
a顶点为交叉计数提供奇数(1),b、c为交叉计数提供偶数(分别是0、2),正好符合算法条件,a是多边形真正的交叉,b、c不是
算法测试结果如下:
测试程序地址:https://github.com/xienb/spatialrelationtest
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论