C# 有效地删除具有相同坡度的点

C# 有效地删除具有相同坡度的点,c#,.net,performance,algorithm,geometry,C#,.net,Performance,Algorithm,Geometry,在我的一个应用程序中,我正在处理图形对象。我正在使用开源来剪辑/合并两个形状。为了提高精度,我正在对现有形状进行采样(在两条边之间添加多个点)。但在显示合并后的形状之前,我需要删除两条边之间的所有点 但我找不到一个有效的算法来移除两条边之间的所有点,这两条边的斜率相同,CPU利用率最低。目前,所有点都是 PointF 我用下面的函数计算斜率 private float Slope(PointF point1, PointF point2) { return (point2.

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

但我找不到一个有效的算法来移除两条边之间的所有点,这两条边的斜率相同,CPU利用率最低。目前,所有点都是

PointF 
我用下面的函数计算斜率

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

任何关于这方面的指针都会有很大帮助。

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

你目前使用的算法是什么?我只能考虑遍历所有点,每3个点检查一个中点是否在由其他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)


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

为了清楚起见,您有三个点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)


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

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

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

一个更具体的标题会很有帮助。你能画一些ASCII图片来说明你的意思吗?他们说一幅画能画上千言万语,这真的能帮助任何人理解你的要求。一个更具体的标题会很有帮助。你能画一些ASCII艺术来表达你的意思吗?他们说一幅画能画上千言万语,这真的能帮助任何人理解你的需求。目前我正在迭代所有点,如果中间点的斜率与第一点和最后一点的斜率相似,则删除中间点。但这项行动需要更多的时间。我正在寻找这个操作的优化数学@Ravi:I使用以下函数计算斜率私有浮点斜率(PointF point1,PointF point2){return(point2.Y-point1.Y)/(point2.X-point1.X);}你有多少点?我不认为数学是这里的瓶颈。你如何通过点进行迭代?它们是如何分类的?它们是在数组中还是在列表中?从阵列中删除点可能需要一些时间!更好的使用列表!目前,我正在迭代所有点,如果中间点的坡度与第一个和最后一个点的坡度相似,则删除中间点。但这项行动需要更多的时间。我正在寻找这个操作的优化数学@Ravi:I使用以下函数计算斜率私有浮点斜率(PointF point1,PointF point2){return(point2.Y-point1.Y)/(point2.X-point1.X);}你有多少点?我不认为数学是这里的瓶颈。你如何通过点进行迭代?它们是如何分类的?它们是在数组中还是在列表中?从阵列中删除点可能需要一些时间!更好的使用列表!