【问题标题】:Algorithm for determine the Arc Mid Point确定弧中点的算法
【发布时间】:2018-06-13 10:34:41
【问题描述】:

我目前正在寻求实现一种能够计算弧中点的算法。从这里开始,我将参考下图。已知的是开始和结束节点(分别为 A 和 B)、中心(点 C)和点 P,它是线 AB 和 CM 的交点(我能够在不知道点 M 的情况下找到该点,因为线AB 垂直于线 CM,因此斜率为 -1/m)。我也知道弧角和弧的半径。我正在寻找 M 点。

我一直在寻找不同的来源。一些人建议将坐标转换为极坐标,从极坐标计算中点,然后恢复为笛卡尔坐标。这涉及到 sin 和 cos(以及 arctan),因为三角函数需要计算时间,所以我有点不愿意这样做。

我一直希望通过将圆弧视为圆并将线 CP 作为与圆在点 M 相交的线来直接计算点 M。然后我会得到两个值,最接近点 P 的值将是正确的交点。但是,这种方法,代数变得又长又复杂。然后我需要为 P = C 和 AB 线是水平和垂直的情况创建特殊情况。这种方法还可以,但我想知道是否有更好的方法可以计算更简单的这一点?

另外,作为旁注,我将在 C++ 中创建此算法。

【问题讨论】:

  • 你知道math.stackexchange.com吗?
  • 是的,我知道这个地方
  • 您知道向量 CP 并希望对其重新归一化以使其具有与 CA 相同的长度?顺便说一句,P 只是 AB 的中点。
  • 这是一道数学题,不是编程题。
  • 似乎矢量CM 只是矢量CP,其长度等于圆弧半径。 CM = CP / |CP| * [arch radius]?

标签: c++ algorithm geometry computational-geometry


【解决方案1】:

然后我会得到两个值

这在代数上是不可避免的。

最接近点 P 的值就是正确的交点。

仅当圆弧覆盖小于 180° 时。

然后我需要为 P = C 时创建特殊情况

这确实是最棘手的情况。如果A, B, C在一条直线上,你不知道哪条弧是弧,也无法回答问题。除非您有一些额外的信息可以开始,例如知道圆弧从 AB 是逆时针方向的。在这种情况下,您知道三角形 ABM 的方向,并且可以使用它来决定选择哪个孤立点,而不是使用距离。

当AB线水平垂直时

将一条线表示为ax + by + c = 0,您可以将所有斜率视为相同。这些是线的齐次坐标,您可以计算它们,例如使用叉积 (a, b, c) = (Ax, Ay, 1) × (Bx, By, 1)。但有关如何最好地计算这些线或将其与圆相交的更详细问题可能应该去 Math Stack Exchange。

是否有更好的方法可以计算更简单的这一点?

投影几何和齐次坐标可以避免很多讨厌的极端情况,例如无限半径的圆(也称为线)或平行线的交点。但是在两种解决方案之间做出选择的问题仍然存在,因此它可能不会让事情变得像您希望的那样简单。

【讨论】:

    【解决方案2】:

    极坐标形式的圆周表示为

    x = Cx + R cos(alpha)
    y = Cy + R sin(alpha)
    

    其中alpha 是从中心C 到点x,y 的角度。现在的目标是如何在没有三角函数的情况下得到alpha

    圆弧中点M,线段中间的点SAB,和你已经计算好的点P,它们都有相同的alpha,它们在来自C 的同一行。

    让我们将向量vx,vy 设为CS。还要计算它的长度:

    vx = Sx - Cx = (Ax + Bx)/2 - Cx
    vy = Sy - Cy = (Ay + By)/2 - Cy
    leV = sqrt(vx * vx + vy * vy)
    

    比起P,我更喜欢S,因为我们可以避免一些问题,例如无限CP斜率或符号应用于斜率(朝向M或其倒数)。

    根据sincos的定义,我们知道:

    sin(alpha) = vy / leV
    cos(alpha) = vx / leV
    

    最后我们得到了

    Mx = Cx + R * vx / leV
    My = Cy + R * vy / leV
    

    注意:要计算R,需要另外一个sqrt 函数,虽然速度不快,但比sin 或cos 快。
    为了获得更好的准确性,请使用 Ra= dist(AC)Rb= dist(BC) 的平均值

    【讨论】:

    • 那么这里的R,是半径吗?如果是这样,那是一个已知参数
    • @philm 是的,R= 半径。我为您只有点(A、B、中心)的情况添加了注释
    • 很酷,谢谢,所以你描述中的 S 点听起来就像我图表中的 P 点。如果是这样,那么这是另一个已知参数。
    • S != P S 在 AB 段和 CM 段上。 P 在 CM 上,但可能不在 AB 上。我的解决方案适用于 S,我不知道它是否也适用于 P。阅读 “我更喜欢...”
    • 点 P 必须在线段 AB 和 CM 上,因为点 P 是线段 AB 和 CM 相互垂直的交点。无论哪种方式,我都会尝试这两种方法(当 S = P 和 S != P 时),看看它是否重要。但我确实喜欢这个算法
    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多