在圆上找点

4
我们正在使用 C++ 编码,在一个半圆上,从某一点(例如 (0,-310))开始,到另一个点结束 (0,310)。我们已经有了半径和方程 X^2 + Y^2 = r^2。现在我们要计算这个圆的线上的一些点(例如10个以上)。
因此,我们需要创建一个增量来计算这些点之间的 Y/X 值,使用上面显示的方程式确保所有计算的点都在圆线上。
一旦我们有了这些点,我们将尝试将它们放入若干复杂的方程中,以计算绘制此形状的机器人臂的角度。这并不是真正的重点,但我认为我应该在问题中包含我们的总体目标。
如何创建一个增量来计算我们两个起始点之间半圆线上的所有坐标?然后将这些值放入代码中的方程中,以计算机器人臂的角度。寻找一种方法在不逐个计算每个点的情况下完成此操作,即创建一个增量,使其一次性完成。 这里是我们的目标,要计算加粗的点。

2
你需要什么帮助,解决方案问题吗? - Thomas Matthews
2
你可能最好使用极坐标 - 例如 http://janjorissen.be/drawing-a-perfect-circle-with-the-curveto-function/ (我知道它是Flash,而不是C ++,但你可以看到这个想法) - Roger Rowland
1
我看不出这个问题与C++有什么关系? - Cheers and hth. - Alf
我理解的对吗,您需要这张图片http://imagehost.spark-media.ru/i4/22F8BA8E-744C-E120-0A89-F8E7AD5376A7.png/2013-03-20_18h35_56.png中粗体点的坐标? - borisbn
什么是问题?这里没有问题。你必须添加一个问题。 - default
好的,'borisbn',这正是我想做的事情。我们正在使用C++编程,并尝试创建一个增量来计算两个起始点之间半圆线上所有坐标的位置。更有意义了吗? - Rory Duncan
3个回答

5
需要点均匀分布吗?如果不需要,那么您可以直接使用您的公式:
// assume half-circle centered at (0,0) and radius=310
double r = 310.0;
int n = 10;
for( int i=0; i<n; i++ )
{
   double x = i*r/n;
   double y = sqrt( r*r - x*x );
   // both (x,y) and (x,-y) are points on the half-circle
}

一旦这个工作正常,你还可以玩弄x值的分布来近似圆形周围的均匀间距。

如果你的圆不是在(0,0)处居中的,那么只需通过实际中心偏移计算的(x,y)。


太棒了,谢谢!我会试一下的。干杯! - Rory Duncan
好的,我尝试了一下。虽然X值会改变,但Y值始终保持在310。有没有办法改变这个? - Rory Duncan
@RoryDuncan -- 当x越接近r时,x * x越接近r * r,因此sqrt(r * r-x * x)越接近零,它不可能停留在310。 必须是编码错误。 - Eric
你是对的,这是我的编码错误。再次感谢。 - Rory Duncan
我不太确定你所说的“你也可以玩弄x值的分布来近似圆周上的均匀间距”的意思。我该怎么做呢?我已经得到了结果,但除非我要求大量结果,否则坐标似乎只显示到半个圆周。我该如何使其在半个圆周上均匀地显示结果?谢谢。 - Rory Duncan

4
圆上的点可以使用以下公式确定:
x = radius * cos(angle)  
y = radius * sin(angle)

您需要确定正在绘制的圆的部分、部分或弧,并确定起始角度和结束角度。

否则,请搜索SO和网络上的“arc drawing algorithm c ++”。


有很多方法可以完成同一件事情,包括使用原帖提供的公式。我既不会使用那个公式,也不会使用你提供的公式。总之,“使用公式…”这句话表明你认为这是“唯一”的方法,但实际上并非如此,有很多种方法可供选择,而你选择的恰恰是最低效的一种。 - Cheers and hth. - Alf
1
重新表述,以避免暗示這是最有效率的方法。可以通過在網上搜索弧形繪製算法來找到更有效率的算法。 - Thomas Matthews
谢谢,我会看一下并尝试一下。 :) - Rory Duncan

2
你可以通过将方程转换为Theta(角度)的形式来完成它,如下所示:
X = X0 + Cos(Theta)*r
Y = Y0 + Sin(Theta)*r

在您的情况下(X0,Y0)=(0,0),r = 310,Theta范围介于-180 - 180之间(如果cos和sin以度数表示)或介于-Phi - Phi之间(如果cos和sin以弧度表示)。
现在,如果您想要10个点,您需要将Theta范围分成10个部分,并为每个值计算X,Y。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接