【问题标题】:Efficiently remove points with same slope有效去除具有相同斜率的点
【发布时间】:2010-04-27 10:22:12
【问题描述】:

在我的一个应用程序中,我正在处理图形对象。我正在使用开源GPC library 来剪辑/合并两个形状。为了提高准确性,我正在对现有形状进行采样(在两条边之间添加多个点)。但在显示合并的形状之前,我需要删除两条边之间的所有点。

但我无法找到一种有效的算法来删除两条边之间的所有点,这些点具有相同的斜率,且 CPU 利用率最低。目前所有的点都是类型

PointF 

我正在使用以下函数计算斜率

  private float Slope(PointF point1, PointF point2)
  {
     return (point2.Y - point1.Y) / (point2.X - point1.X);
  }

任何关于此的指针都会有很大帮助。

【问题讨论】:

  • 一个更具体的标题会很有帮助。
  • 你能画一些ASCII艺术来表达你的意思吗?他们说一张图描绘一千个字,它真的可以帮助任何人理解你的要求。

标签: c# .net performance algorithm geometry


【解决方案1】:

您目前使用什么算法?我只能考虑遍历所有点,并为每 3 个点检查中间点是否在由其他 2 个点定义的矢量(或接近)上。 该操作需要数学吗?

【讨论】:

  • 目前我正在遍历所有点,如果它的斜率类似于第一个和最后一个点的斜率,则删除中间一个。但是这个操作需要更多的时间。我正在为这个操作寻找优化的数学
  • @Ravi:我使用以下函数计算坡度 private float Slope(PointF point1, PointF point2) { return (point2.Y - point1.Y) / (point2.X - point1.X); }
  • 你有多少积分?我不认为,数学在这里是瓶颈。你如何遍历点?它们是如何排序的?它们是数组还是列表?从数组中删除点可能需要一些时间!更好的使用清单!
【解决方案2】:

为了清楚起见,您有三个点 A = (a,b)、C = (c,d) 和 E = (e,f),并且想知道线段 AE 是否通过 C,因此您可以用单段AE代替AC和CE这对段吗?

斜率 AC = (d-b)/(c-a) = 斜率 CE = (f-d)/(e-c)

乘以分母,你得到 (d-b)(e-c) = (f-d)(c-a)

这只是四次减法、两次乘法和一次比较。由于使用浮点,您需要进行一些容错比较。

【讨论】:

    【解决方案3】:

    嗯.. 我找到了我的问题的解决方案。我没有使用 SDK 提供的采样方法,而是创建了自己的采样方法,在固定距离的两点之间插入一个点。这减少了我需要处理的点数,从而减少了处理器的使用。

    【讨论】:

      猜你喜欢
      • 2015-11-01
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多