圆圈上的点,有限制。如何计算没有角度,但半径和中心点?

时间:2013-03-26 00:29:30

标签: c++ excel geometry

解释起来相当复杂,所以我会尽力而为,如果有什么我错过了对不起,请告诉我,我会纠正它。

我的问题是,我的任务是画出这种形状,

Crescent Moon http://www.learnersdictionary.com/art/ld/crescent.gif

这是使用C ++来编写将计算此形状上的点的代码。

重要细节。

用户输入 - 中心点(X,Y),要显示的点数,字体大小(影响半径)

输出 - 形状上的坐标列表。

总体目标一旦得到点就是将它们放在Excel上的图形中,它将有希望以用户输入的大小为我绘制它!

我知道最大半径为165毫米,最小半径为35毫米。我已经决定我的基础Font Size应该是20岁。然后我做了一些思考并提出了等式。

半径=(选择字体大小/ 20)* 130。这只是一个估计,我意识到它可能不对,但我认为它至少可以作为一个模板。

然后我决定创建两个不同的圆,有两个不同的中心点,然后将它们链接在一起以创建形状。我认为INSIDE线必须具有更大的半径和沿X轴进一步的中心点(Y保持不变),因为它可以切入外线。

所以我将第二个中心点定义为(X + 4,Y)。 (再次,只是估计,认为它们相隔多远并不重要。)

然后我决定Radius 2 =(选择字体大小/ 20)* 165(最大半径)

所以,我有2个半径和两个中心点。

现在要计算圈子上的积分,我真的很挣扎。我决定最好的方法是创建一个增量(这里是模板)

for(int i=0; i<=n; i++) //where 'n' is users chosen number of points
{ 
  //Equation for X point
  //Equation for Y Point
  cout<<"("<<X<<","<<Y<<")"<<endl;
}

现在,对于我的生活,我无法弄清楚计算积分的等式。我找到了involve angles的方程式,但由于我没有,我正在努力。

在本质上,我试图在这里计算点'P',除了一直围绕圆圈。 Points on a circle http://images.tutorvista.com/cms/images/67/equation-circle.png

我想到的另一点可能是问题是对计算出的值施加限制以仅显示形状上的值。不确定如何选择限制除了使外线成为一个完整的半圆所以我有一个最大半径?

因此。有没有人有任何提示/提示/链接,他们可以与我分享如何进行完全?

再次感谢,如有任何问题,抱歉,如果您让我知道,我会尽力纠正。

干杯

UPDATE;

R1 = (Font/20)*130;
R2 = (Font/20)*165;

for(X1=0; X1<=n; X1++)
{
    Y1 = ((2*Y)+(pow(((4*((pow((X1-X), 2)))+(pow(R1, 2)))), 0.5)))/2;
    Y2 = ((2*Y)-(pow(((4*((pow((X1-X), 2)))+(pow(R1, 2)))), 0.5)))/2;
    cout<<"("<<X1<<","<<Y1<<")";
    cout<<"("<<X1<<","<<Y2<<")";
}

意见?

2 个答案:

答案 0 :(得分:2)

圆的等式是

(x - h)^2 + (y - k)^2 = r^2

使用一点代数,您可以在从xh的范围内迭代h+r,增加一些适当的delta并计算y的两个对应值。这将绘制一个完整的圆圈。

下一步是找到两个圆的交点的x坐标(假设月亮形状由两个合适的圆圈定义)。再一次,一些代数和一支铅笔和纸会有所帮助。

更多详情:

要绘制圆而不使用极坐标和trig,您可以执行以下操作:

for x in h-r to h+r increment by delta
    calculate both y coordinates

要计算y坐标,需要求解y的圆方程。最简单的方法是将其转换为A*y^2+B*y+C=0形式的二次方程,并使用二次方程式:

(x - h)^2 + (y - k)^2 = r^2
(x - h)^2 + (y - k)^2 - r^2 = 0
(y^2 - 2*k*y + k^2) + (x - h)^2  - r^2 = 0
y^2 - 2*k*y + (k^2 + (x - h)^2  - r^2) = 0

所以我们有

A = 1
B = -2*k
C = k^2 + (x - h)^2  - r^2

现在将这些插入到二次方程中,并为for循环中的每个x值挖出两个y值。 (很可能,您需要在单独的函数或函数中进行计算。)

正如你所看到的,这非常混乱。使用三角学和角度进行此操作会更加清晰。

更多想法:

即使问题中描述的用户输入中没有角度,也没有内在的理由说明为什么你不能在计算过程中使用它们(除非你有特定的要求,否则,因为你的老师告诉你不要)。话虽如此,使用极坐标使这更容易。对于完整的圆圈,您可以执行以下操作:

for theta = 0 to 2*PI increment by delta
    x = r * cos(theta)
    y = r * sin(theta)

要绘制圆弧而不是整圆,只需更改for循环中theta的限制即可。例如,圆圈的左半部分从PI/2变为3*PI/2

答案 1 :(得分:2)

根据Code-Guru关于这个问题的评论,内圈看起来更像是半圈而不是外圈。使用Code-Guru的答案中的等式来计算内圈的点数。然后,看看this question如何计算与你的圆相交的圆的半径,给定距离(你可以任意设置)和交点(你知道,因为它是一个半圆) )。从这里你可以绘制任何给定距离的外弧,你需要做的只是改变距离,直到你产生一个你满意的形状。

This question可以帮助您应用Code-Guru的等式。