【问题标题】:Spikes when offsetting with C# clipper使用 C# 剪裁器偏移时出现尖峰
【发布时间】:2013-10-19 07:04:50
【问题描述】:

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

我的应用程序分层模型并计算轮廓多边形。然后它还必须偏移轮廓。具有大量曲线的图层往往会出现一个或多个尖峰,例如:

现在这似乎还不错,但是一旦发生在很多层上,模型就会变成这样:

重要的是要注意,如果不偏移轮廓,我不会得到这些尖峰。

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

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

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

【问题讨论】:

  • 我不知道 Clipper 的偏移功能有任何重大问题,因此除非您可以提交一些示例数据,否则很难提供帮助。突出问题的图片可能也会有所帮助。
  • 好的,等我到我的电脑上,我会添加一些图片
  • @AngusJohnson 我现在添加了一些图片
  • 图像很好地表明某处存在问题,但我需要一些数据 - 即输入多边形坐标(仅用于一个多边形)、偏移函数中使用的增量和其他参数,以及由函数(包含尖峰)。
  • @AngusJohnson 我现在添加了描述输入和输出多边形上的点的文本文件

标签: c# polygon polygons clipperlib


【解决方案1】:

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

这是 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 只是一个足够接近零的值,可以消除您提供的样品中的尖峰,但可能需要通过进一步测试重新调整。

【讨论】:

  • 太棒了。我很高兴它已修复:)。
  • 我现在只是在使用 jtMiter,因为它现在似乎工作正常,但是应该警告尝试将它与 jtRound 一起使用的人现在非常慢
  • 这太令人惊讶了。试试这个: if (m_sinA -0.00005) return;
  • 不幸的是生成了空多边形
  • 不应该。无论如何,我认为我们最好通过电子邮件或在 Clipper 的 SourceForge 论坛(任何 Clipper 支持问题的首选)中进一步讨论这个问题。
猜你喜欢
  • 1970-01-01
  • 2013-10-20
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2015-04-12
相关资源
最近更新 更多