【问题标题】:find the length of any arc on a circle求圆上任意弧的长度
【发布时间】:2013-10-02 02:19:58
【问题描述】:

我有一个有趣的问题(无论如何对我来说)。我正在为 V4 开发 OpenServo.org,我正在尝试确定行程弧的长度及其方向。

我有一个磁编码器,它可以将轴的位置从 0 返回到 4095。

舵机有两个逻辑端点,分别称为 MAX 和 MIN,它们在软件中设置并且可以随时更改,并且轴必须在 MAX 和 MIN 位置之间的一个圆弧上旋转(即行进)。例如,图中蓝色弧线有效,但红色弧线不适用于所有行程(包括 MIN 和 MAX)。

我正在尝试仅使用整数数学来制定一个简单的算法,该算法可以告诉我任意两点 A 和 B 之间的距离,该距离可以在圆周上的任何位置,以 MIN 和 MAX 为界,并且 A 作为当前位置B是目标位置,或者B是当前地点,A是目标(用B到A的负距离表示)。请注意,我允许旅行的一侧是已知的,它是“红色”或“蓝色”。

问题是当 ARC 中存在 4095/0 时,计算变得有点有趣。

【问题讨论】:

  • 我们如何知道弧的哪一边是有效的? IE。为什么是蓝色的,而不是红色的?
  • 在软件中设置,防止轴转动到不应该转动的地方。例如,这可能是肘关节,蓝色弧线有效但红色在机械上是不可能的(或者可能允许红色弧线,A 为 3000,B 为 2500,A 和 B 指示哪个 ARC 对旅行)..
  • 更改 MIN 和 MAX 时是否保证 A 和 B 不会在对立面?
  • 当 MIN 和 MAX 更改时,A 和 B 也会更改以指示您可以行驶哪一侧,因此 A 和 B 始终位于 MIN 和 MAX 之间的正确弧上
  • 感谢您的回复,其中两个回复算法有效,第三个我无法开始工作。我真的很喜欢 Mark Ransom 非常简单的逻辑,但我很欣赏 Paul Griffith 的程序。非常感谢。

标签: c algorithm geometry


【解决方案1】:

您需要调整所有坐标,使它们位于限制点的同一侧。由于它是一个循环系统,因此您可以在不影响绝对位置的情况下添加 4096。

lowest = min(MIN, MAX);
if (A < lowest)
    A += 4096;
if (B < lowest)
    B += 4096;
distance = B - A;  /* or abs(B - A) */

在您的示例中,A 不会被调整,但 B 会被调整为 5156。差值为正 1116。

在您的第二个示例中,A=3000 和 B=2500,它们都高于 2000,因此都不需要调整。差值为-500。

【讨论】:

  • 非常好的算法,简洁明了!
【解决方案2】:

这是一个简单的算法:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int rotate_diff(int a, int b, bool * clockwise);

int main(void) {
    int degrees_rotated, a, b;
    bool clockwise;

    a = 4040;
    b = 1060;
    degrees_rotated = rotate_diff(a, b, &clockwise);
    printf("A = %d, B = %d, rotation = %d degrees, direction = %s\n",
            a, b, degrees_rotated,
            (clockwise ? "clockwise" : "counter-clockwise"));

    return EXIT_SUCCESS;
}

int rotate_diff(int a, int b, bool * clockwise) {
    static const int min = 2000;

    if ( a <= min ) {
        a += 4096;
    }
    if ( b <= min ) {
        b += 4096;
    }

    int degrees_rotated = b - a;
    if ( degrees_rotated > 0 ) {
        *clockwise = false;
    } else {
        degrees_rotated = -degrees_rotated;
        *clockwise = true;
    }

    return degrees_rotated * 360 / 4096;
}

请注意,这会给您行进的度数,而不是行进的距离,因为您没有告诉我们轴的尺寸是多少。要获得经过的距离,显然将周长乘以经过的度数除以 360。如果您的点 0 到 4095 是某种已知单位,则只需跳过上述算法中的度数转换,并相应地更改变量名称。

【讨论】:

  • 综合解决方案:-)
【解决方案3】:

除非我错过了什么,否则这应该会给出你需要的结果:

if MIN < A,B < MAX
    distance = A - B
else
   if A > MAX and B < MIN
       distance = A - (B + 4096)
   else if B > MAX and A < MIN
       distance = (A + 4096) - B
   else
       distance = A - B

(如果不需要方向,获取距离的绝对值)

【讨论】:

  • 要处理您的伪代码,如果 2000
  • 呸,应该使用一些正常的语法。我的意思是 A 和 B 在 (MIN, MAX) 范围内。
猜你喜欢
  • 2013-10-09
  • 2014-05-01
  • 1970-01-01
  • 2016-03-27
  • 2012-07-12
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多