为什么计算面积小于0?

来源:互联网 发布:儿童编程培训班多少钱 编辑:程序博客网 时间:2024/05/01 07:04

一想到面积的计算,就可能使用IArea接口。实现IArea接口的常用类包括:Envelope、Polygon和Ring。Envelope表示的是一个矩形对象,Polygon表示的是一个任意复杂的区域,Ring表示一个简单的环,这个环由一组相互连接的段(segment)组成。所以,只要对象实现了IArea接口,那么获取面积就非常简单了。下面是一段获取面积的代码:

IArea pArea = theGeometry as IArea;

if (pArea != null)

{

double area = pArea.Area;

//...

}

一切就这么简单。但是,实际运行过程中,居然会出现面积小于0的情况,真是百思不得其解啊。仔细查看了帮助文档,才发现原来Ring还分为两类,一类是外环(exterior ring),一类是内环(interior ring)。区分这二者的直接办法是看坐标点的方向,如果是顺时针,那么就是外环,如果逆时针就是内环。内环的面积是小于0的,外环的面积是大于0的。假设有如下图所示的四个点:

clip_image002

假设有如下代码:

IPoint p1, p2, p3, p4;

//创建第一个环

RingClass pc1 = new RingClass();

pc1.AddPoint(p1);

pc1.AddPoint(p2);

pc1.AddPoint(p3);

pc1.AddPoint(p4);

double d1 = pc1.Area;

bool isExterior1 = pc1.IsExterior();

//创建第二个环

RingClass pc2 = new RingClass();

pc2.AddPoint(p1);

pc2.AddPoint(p4);

pc2.AddPoint(p3);

pc2.AddPoint(p2);

double d2 = pc2.Area;

bool isExterior2 = pc2.IsExterior;

你仔细比较才能发现,pc1添加坐标点的次序是顺时针的,pc2的添加坐标点顺序是逆时针的,所以pc1是外环,pc2是内环。这样,下面的几个结论就显而易见了:

d1>0

isExterior1 = true

d2<0

isExterior2 = false