在圆上查找点[关闭]
Posted
技术标签:
【中文标题】在圆上查找点[关闭]【英文标题】:Find points on circle [closed] 【发布时间】:2013-03-20 14:11:19 【问题描述】:我们正在用 C++ 编码,有半个圆圈,从某个点开始(例如 (0,-310)
)并在某个点结束 (0,310)
。我们有半径,我们有等式X^2 + Y^2 = r^2
。现在我们正在尝试计算这个圆线上的一些(比如 10+)点。
因此,我们尝试创建一个增量来计算这些点之间的 Y/X 值,使用上面显示的等式确保所有计算的点都在圆线上。
一旦我们有了这些点,我们就会尝试将它们放入几个复杂的方程中,以计算要绘制此形状的机器人手臂的角度。这并不是真正的优先事项,但我认为我应该在问题中包含我们的总体目标。
如何创建一个增量来计算我们两个起点之间的半圆线上的所有坐标? 然后将这些值代入上面代码中的方程,计算机械臂的角度。寻找一种方法来做到这一点而不单独计算每个点,即创建一个可以一次性完成的增量。
This 是我们的目标,以粗体计算点数。
【问题讨论】:
您需要什么帮助,解决点数? 使用极坐标可能会更好 - 例如janjorissen.be/…(我知道它是 Flash,不是 C++,但你可以看到这个想法) 我看不出这个问题和C++有什么关系? 我是否理解正确,您需要这张图片中的粗体坐标imagehost.spark-media.ru/i4/… ? 问题是什么?这里没有问题。您必须添加一个问题。 【参考方案1】:圆的点可以使用以下公式确定:
x = radius * cos(angle)
y = radius * sin(angle)
您必须确定要绘制的圆的部分、部分或圆弧,并确定起始角度和结束角度。
否则,请在 SO 和网络上搜索“arc drawing algorithm c++”。
【讨论】:
有多种方法可以给猫剥皮,包括使用 OP 提供的公式。我既不会使用那个公式,也不会使用你提出的那个。无论如何,措辞“使用公式...”表示您认为这是执行此操作的“方法”,但事实并非如此,有很多方法,而您选择的方法恰好是效率最低的全部。 重新措辞以免暗示这是最有效的方法。更高效的算法可以通过在网上搜索圆弧绘制算法找到。 谢谢,我会看看并试一试。 :)【参考方案2】:这些点需要均匀分布吗?如果没有,那么您可以直接使用您的公式:
// 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)
偏移实际中心即可。
【讨论】:
那太好了,谢谢,会试一试。干杯! 好的,我试过了。当 X 值发生变化时,Y 值始终停留在 310。有什么办法可以改变吗? @RoryDuncan -- 随着 x 越来越接近 r,xx 越来越接近 rr 所以 sqrt(rr - xx)越来越接近零,不可能一直停留在 310。一定是编码错误。 你是对的,我的编码错误。再次感谢 我不太确定您的意思是“您也可以使用 x 值的分布来近似圆周围的均匀间距。”我该怎么做?我有结果,但除非我要求大量结果,否则坐标似乎在圆的中途停止。我如何得到它,以便它显示在半圈周围均匀分布的结果?谢谢【参考方案3】:您可以通过将方程更改为 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。
【讨论】:
谢谢,会调查的:)以上是关于在圆上查找点[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
2017CCPC-哈尔滨站 Hdu-6242 Geometry Problem 计算几何 随机