使用C#clipper进行偏置时出现尖峰

使用C#clipper进行偏置时出现尖峰,c#,polygon,polygons,clipperlib,C#,Polygon,Polygons,Clipperlib,在使用clipper库偏移多边形时,我会遇到很多尖峰,不幸的是,这在我的用例中是不可接受的,我不知道如何消除它。我已经尝试了所有类型的连接类型设置,但无法实现任何功能。任何帮助都将不胜感激 我的应用程序将模型分层并计算轮廓多边形。然后还必须偏移轮廓。具有大量曲线的层倾向于获得一个或多个尖峰,如下所示: 现在这似乎并不坏,但一旦它发生在许多层上,模型就会变成这样: 重要的是要注意,在不抵消轮廓的情况下,我不会得到这些尖峰 以下是包含输入多边形的文件: 以下是包含输出多边形的文件: 该操作的

在使用clipper库偏移多边形时,我会遇到很多尖峰,不幸的是,这在我的用例中是不可接受的,我不知道如何消除它。我已经尝试了所有类型的连接类型设置,但无法实现任何功能。任何帮助都将不胜感激

我的应用程序将模型分层并计算轮廓多边形。然后还必须偏移轮廓。具有大量曲线的层倾向于获得一个或多个尖峰,如下所示:

现在这似乎并不坏,但一旦它发生在许多层上,模型就会变成这样:

重要的是要注意,在不抵消轮廓的情况下,我不会得到这些尖峰

以下是包含输入多边形的文件:

以下是包含输出多边形的文件:


该操作的参数是一个偏移操作,其jtRound JointType具有默认限制。三角洲为-25000。我还尝试了所有其他JoinType,限制范围从0到1000,但它们都创建了完全相同的峰值。其他的jointype还有一些奇怪的效果。

好的,我可以确认有一个bug。当相邻多边形边几乎共线时会发生这种情况

以下是clipper.cs中关于第4220行的修复(尚未经过严格测试)

      void OffsetPoint(JoinType jointype)
      {
          m_sinA = (normals[m_k].X * normals[m_j].Y - normals[m_j].X * normals[m_k].Y);
          if (Math.Abs(m_sinA) < 0.00005) return; //ADD THIS LINE (todo - check this!)
          else if (m_sinA > 1.0) m_sinA = 1.0;
          else if (m_sinA < -1.0) m_sinA = -1.0;
无效偏移点(JoinType JoinType)
{
m_sinA=(法线[m_k].X*法线[m_j].Y-法线[m_j].X*法线[m_k].Y);
if(Math.Abs(m_sinA)<0.00005)return;//添加此行(todo-检查!)
否则,如果(m_sinA>1.0)m_sinA=1.0;
如果(m_sinA<-1.0)m_sinA=-1.0;

注意:0.00005只是一个接近零的值,足以消除您提供的样本中的峰值,但它可能需要通过进一步测试重新调整。

我不知道Clipper的偏移功能有任何重大问题,因此除非您提交一些样本数据,否则很难提供帮助。突出显示问题的图像将可能也会有帮助。好的,我一到我的网站就会添加一些图片pc@AngusJohnson我现在添加了一些图片。这些图片很好地显示了某个地方存在问题,但我需要一些数据-即输入多边形坐标(仅用于一个多边形)、偏移函数中使用的增量和其他参数,以及函数返回的解(包含尖峰)。@AngusJohnson我现在添加了描述输入和输出多边形上的点的文本文件很棒。我很高兴它已修复:)。我现在只使用jtMiter,因为它现在似乎工作正常,但尝试将其用于jtRound的人应该被警告,现在速度非常慢,这令人惊讶。请尝试以下方法:如果(m_sinA<0.00005&&m_sinA>-0.00005)返回;不幸的是,这会生成空的polygons,它不应该生成空的polygons。无论如何,我认为我们最好通过电子邮件或在Clipper的SourceForge论坛(对于任何Clipper支持问题,这是首选)进一步讨论这个问题。