13

我的应用程序是表示地球表面上的形状(使用球体就足够了)。这些可以是点、线和多边形。坐标应该使用度数或弧度来定义(就像地理坐标一样)。

球面上两点之间的线段应位于其大圆上。多边形应该由这些线条的集合组成。此外,我想对提到的形状执行集合 - 基本操作,如交集、联合、差异、补码。这些操作只需要输出点的集合。

我尝试使用 CGAL 的3D Spherical Geometry Kernel2D Boolean Operations on Nef Polygons Embedded on Sphere 来解决这个问题。实际上,我在球体上划线时已经遇到了问题。此外,CGAL 在欧几里得空间中工作,这仍然给我留下了必要的几何运算,以处理放置在球体上的大圆圈。

我的问题是,您是否可以帮助我实现 CGAL 中提到的功能,或者您是否可以推荐另一个用于 C/C++ 的库来做到这一点。非常感谢!

4

3 回答 3

1

我建议你看看这个:

http://www.codeguru.com/Cpp/Cpp/algorithms/general/article.php/c5115/

问题 1E 解决了两个大圆之间的交叉问题。从此,您可以定义球体上形状的基本操作,而无需像 CGAL 或 GEOS 这样的大依赖。

于 2010-06-30T13:26:21.180 回答
1

如果您想做一般多边形集操作,如联合/交集等,那么您可以从http://www.cs.man.ac.uk/~toby/alan/software/查看一般多边形剪裁器库

于 2010-07-08T14:13:20.830 回答
0

找到两个对象的交集通常需要将定义对象的方程设置为彼此相等。

这是一种方式,这可能只是 Vitor 回答的另一种措辞。

首先将每条线(弧)定义为参数方程。无论好坏,我都将这些弧线视为旋转时归一化向量所采用的路径。这就是我定义它们的方式(我敢打赌有更好的方法)。

所以我会取起点和终点,把它们当作向量,取叉积来得到旋转轴,点积得到角度。

所以我的弧方程看起来像

arc(t) = startPoint * (axisAngleToRotationMatrix (axis, t * angle))

然后,您将设置两个弧方程彼此相等,并求解得到的方程组,每个方程中的“t”。

于 2010-07-06T23:43:06.500 回答