后来把计算面积公式里的 double 换成了 doubledouble 类,把精度加倍,结果就正确了。
寻思坐标也不是什么很大的值,怎么 double 就当场挂掉了呢?
=========
测试代码如下:
double buf[6];
buf[0*2+0] = 830776.16442871094; buf[0*2+1] = 430600.56744384766;
buf[1*2+0] = 830776.37707519531; buf[1*2+1] = 430600.68286132813;
buf[2*2+0] = 830776.16430664063; buf[2*2+1] = 430600.56732177734;
int numvertex = 3;
double area = 0.0;
for (int p=numvertex-1,q=0; q<numvertex; p=q++)
{
double a1 = buf[p*2+0] * buf[q*2+1];
double a2 = buf[q*2+0] * buf[p*2+1];
area += a1 - a2;
}
最终 area 结果
如果是 double ,那么值是 0.0000610 (错误)
如果是 doubledouble ,那么值是-0.0000118 (正确)
看起来是计算误差问题,但结果一个正,另一个负,足以把程序逻辑搞得天翻地覆。