【发布时间】:2014-05-06 20:29:03
【问题描述】:
我正在处理地理信息,最近我需要绘制一个椭圆。为了与 OGC 约定兼容,我不能按原样使用椭圆;取而代之的是,我使用多边形来近似椭圆,方法是采用椭圆包含的多边形并使用任意多个点。
我用来为给定数量的点 N 生成椭圆的过程如下(使用 C# 和虚构的 Polygon 类):
Polygon CreateEllipsePolygon(Coordinate center, double radiusX, double radiusY, int numberOfPoints)
{
Polygon result = new Polygon();
for (int i=0;i<numberOfPoints;i++)
{
double percentDone = ((double)i)/((double)numberOfPoints);
double currentEllipseAngle = percentDone * 2 * Math.PI;
Point newPoint = CalculatePointOnEllipseForAngle(currentEllipseAngle, center, radiusX, radiusY);
result.Add(newPoint);
}
return result;
}
到目前为止,这已经为我服务了很长时间,但我注意到它有一个问题:如果我的椭圆是“粗壮”的,也就是说,radiusX 远大于 radiusY,则顶部的点数椭圆与椭圆左边的点数相同。
这是对积分的浪费!在椭圆的上部添加一个点几乎不会影响我的多边形逼近的精度,但在椭圆的左侧添加一个点会产生重大影响。
我真正想要的是一种用多边形近似椭圆的更好算法。我需要从这个算法中得到什么:
- 它必须接受点数作为参数;可以接受每个象限中的点数(我可以迭代地在“有问题”的地方添加点,但我需要很好地控制我正在使用的点数)
- 必须以椭圆为界
- 它必须包含椭圆中心的正上方、正下方、向左和向右的点
-
它的面积应该尽可能接近椭圆的面积,当然优先考虑给定点数的最优值(见 Jaan 的回答 - 显然这个解决方案已经是最优的了) - 多边形的最小内角最大
我想到的是找到一个多边形,其中每两条线之间的角度始终相同 - 但我不仅不知道如何生成这样的多边形,我什至不确定存在,即使我取消了限制!
有人知道如何找到这样的多边形吗?
【问题讨论】:
-
我想解决这个问题的一种方法是考虑多边形边界的梯度(导数)。考虑多边形上的一个点,以及它的两个直接邻居。您可以计算从该点到其邻居的两条边形成的角度。您拥有的点越多,该角度将趋于 180 度。当您的点数很少时,“不必要”的点将具有大角度(接近 180),“需要更多”的点将具有小角度。因此,在此处添加更多点,将不需要的点删除一次。希望对您有所帮助。
-
您的建议与下面 MaMazav 提供的类似,就像我说的那样,这是一个很好的后备方案,但我更喜欢有更多保证的东西
-
图片是人工画的,不是算法画的吧?如果将
CalculatePointOnEllipseForAngle实现为new Point (radiusX*cos(currentEllipseAngle) + center.x, radiusY*sin(currentEllipseAngle) + center.y),则图片将情况夸大了。
标签: c# geometry polygon computational-geometry ellipse