CGAL通用多边形:刚体运动和面积

3
调查这个问题,我将处理边界由线段和圆弧组成的形状。看起来CGAL应该能够帮助我:根据用户手册的这一部分,具有Gps_segment_traits_2作为其特征类的General_polygon_set_2应该能够表达我需要的大部分操作,尤其是交集和差异。 到目前为止,我在文档中没有找到一种方法可以对这些形状应用刚性运动,并计算结果形状的面积。 我想我可以解决这两个问题。对于刚性运动,我可以在转换原始定义对象后重新创建形状。而要计算面积,我可以使用变化式的鞋带法,调整以处理圆弧。手册中的示例打印支持圆的详细信息,并且通过挖掘头文件,我发现我的多边形的每个曲线确实具有supporting_circle()方法,因此我猜它实际上是一个Arr_circle_segment_traits_2<K>::X_monotone_curve_2。因此,我应该能够获得足够的圆信息来计算面积。在手册中,一些对象只被描述为unspecified_type,我使用故意的编译器错误消息来了解一些对象的类型,才找到了这个。

然而,这两个操作都需要相当多的工作,我很惊讶似乎没有内置的方法来完成这些操作。另一方面,CGAL通过模板参数进行自定义的方式,我可能只是错过了一种适用于圆弧段但可能不适用于其他一般多边形的方法。您知道我可以使用的任何快捷方式吗?


1
你好。我是一个CGAL开发者。我自己也不确定答案,因为我不太了解CGAL的布尔运算和排列包。我已经将您的问题转发给开发者的内部邮件列表。希望我们中的某个人能够帮助您。 - lrineau
@lrineau:非常感谢!我的解决方法转换输入对象在性能方面可能存在问题。我自己编写了一些代码来逐个转换多边形集,但在重构转换后的多边形时,我违反了某些先决条件。可能是因为我正在使用Epick内核,并将一个根点简单地转换为双精度。目前,我正在认真考虑从头开始实现这个布尔运算。但也许有些开发人员可以帮助我,至少概述如何扩展CAGL以满足我的需求。 - MvG
1个回答

3

很抱歉,我的回答可能会让你不太满意。

我是一个CGAL开发者,实际上是Reg.布尔运算和Arrangement包的开发者之一。

首先,您所要求的操作是不支持的。

关于计算面积,您的方法似乎可行。然而,对于我们来说,要求这样的操作在概念中需要付出很大的努力,因为我们还需要为我们支持的所有traits类实现该操作。我想,可以从其中一个开始,然后逐个添加。我会将其放入待办列表中,但我不会把赌注押在快速交货上......

关于变换,答案更加复杂。正如您已经注意到的那样,在(确切的)几何形状(例如,Arrangement,通用多边形集合或甚至小型线性简单凸多边形)上应用非精确变换可能会有害。您必须提供一个精确的变换,例如一个变换矩阵,该矩阵由精确类型的数字组成--与表示(精确的)几何元素的坐标相同(或至少可以互相转换)类型。问题是,自然地,旋转,因为您通常从一个角度开始,并使用三角函数(例如sin()和cos())计算旋转矩阵。假设您想要按给定的角度,比如alpha进行旋转。您需要计算alpha的近似值,使得sin(alpha)和cos(alpha)是有理数,因此可以用前面提到的精确类型的数字表示。自由函数CGAL::rational_rotation_approximation()可以帮助您。正如该函数的手册条目所述,该近似值基于Farey序列,如Canny和Ressler在第8届SoCG 1992年所介绍的有理旋转方法。

祝你好运!


非常感谢您的回答!只是为了澄清一下,这是否意味着我必须将所有计算转换为有理核和有理数?毕竟,如果我用不精确的双倍数乘以它们,计算准确的有理近似旋转矩阵是没有帮助的,对吗?什么适用于双倍数,什么不适用于双倍数的分界线在哪里?像我失败的前提条件中的那种相等性检查听起来只能在某些情况下适用于双倍数,并且可能在其他情况下会出错。是这种情况吗? - MvG
1
不完全正确,您必须使用精确谓词精确构造内核。有些内核支持代数数,但不一定是有理数。我建议仅在确定有理内核不足时(例如,需要计算某个数字的根)才使用它们。然而,并不存在支持超越数(例如π)的内核。正如您所说,使用双精度浮点数可能会导致代码崩溃,并且在某些情况下最终会崩溃,尤其是涉及到复杂数据结构(例如排列)时。 - Efi Fogel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接