我需要实现一个Minkowski和函数,它可以返回2个圆,2个凸多边形或圆和凸多边形的Minkowski和。我发现this线程解释了如何为凸多边形做这个,但我不知道如何为圆和多边形做这个。另外,我怎么能代表答案?!我希望算法在O(n)时间运行,但乞丐不能选择。
答案 0 :(得分:2)
圆是微不足道的 - 只需添加中心点,然后添加半径即可。 Circle + ConvexPoly几乎一样简单:将每个线段垂直向外移动圆半径,并使用以原始多边形顶点为中心的圆弧连接相邻线段。用圆心点翻译整个。
至于你如何表达答案:嗯,这取决于你想用它做什么。如果您只想使用矢量绘图库绘制它,可以将其转换为NURBS。如果您只想要多边形近似,则可以使用折线近似圆弧。或者你可以按原样存储它 - “这个多边形,由这样的半径扩展”。例如,这将是像光线投射这样的事情的最佳选择。或者作为折衷方案,您可以线性连接相邻的段而不是圆弧,并将其存储为(新)凸多边形和顶点圆列表的并集。
哦,关于ConvexPoly + ConvexPoly。这是最棘手的,但仍然很简单。基本思想是你为每个多边形取一个段向量列表(从一个特定的极值点开始,比如每个多边形上具有最低X坐标的点),然后将两个列表合并在一起,保持按角度排序。对开始时的两个点求和,然后应用合并向量列表中的每个向量以生成其他点。