公司项目,要实现用户在矩形的红外图像上圈一块区域,计算该区域内部的平均温度、最大、最小温度,圈的区域有多是矩形、椭圆、或者任意由多条线段构成的多边形,实现这个需求能够转换为求一个点是否在该几何图形内部,下面总结一下各类几何图形的判断方法。git
1.矩形github
判断点是否在矩形内,只要肯定点的坐标在矩形四个顶点限定范围内便可算法
如上图,知足x<=x2&&x>x1&&y>y1&&y<y便可测试
2.椭圆spa
判断点是否在椭圆内,能够根据椭圆表达式求得code
如上图,若是a>b,即焦点在x轴上,则知足(x*x/a/a+y*y/b/b < 1)的点在椭圆内,若是a<b,即焦点在y轴上,则知足(y*y/a/a+x*x/b/b<1)的点在椭圆内blog
3.由多个点构成的不规则图形get
对于不规则图形,能够经过射线法判断,即计算射线与多边形各边的交点,若是是偶数,则点在多边形外,不然在多边形内it
算法代码以下:io
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不是
算法测试结果以下: