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

时间:2013-10-19 07:04:50

标签: c# polygon polygons clipperlib

当使用限幅器库偏移多边形时,我得到了相当多的峰值,遗憾的是在我的用例中这是不可接受的,我不知道如何摆脱它。我尝试了所有类型的连接类型设置,但无法实现任何目标。任何帮助将不胜感激。

我的应用程序对模型进行分层并计算轮廓多边形。然后它还必须抵消轮廓。那时候有很多曲线的图层往往会得到一个或多个尖峰,例如: enter image description here

现在这似乎并不坏但是一旦它发生在很多层中,模型就会变成这样: enter image description here

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

这是一个包含输入多边形的文件: http://sdrv.ms/H7ysUC

这是一个包含输出多边形的文件: http://sdrv.ms/1fLoZjT

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

1 个答案:

答案 0 :(得分:2)

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

以下是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;

注意:0.00005只是一个足够接近零的值,用于消除所提供样品中的尖峰,但可能需要通过进一步测试重新调整。