2

这解释起来很复杂,所以我会尽力而为,如果有什么遗漏的地方,请告诉我,我会改正的。

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

新月
(来源:learnersdictionary.com

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

重要细节。

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

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

一旦我有了这些点,总体目标就是将它们放入 Excel 上的图表中,并希望它会以用户输入的大小为我绘制它!

我知道最大半径为 165 毫米,最小为 35 毫米。我决定我的基本字体大小应该是 20。然后我想了想,想出了这个等式。

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

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

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

然后我决定 Radius 2 = (Chosen Font Size/20)*165 (max radius)

所以,我有我的 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;
}

现在,对于我的一生,我无法找出一个方程式来计算分数。我找到了涉及角度的方程,但因为我没有,所以我很挣扎。

本质上,我是在尝试在这里计算“P”点,除了一直绕着圆圈。 (来源:tutorvista.com圆上的点

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

所以。有没有人可以与我分享有关如何准确进行的任何提示/提示/链接?

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

干杯

更新;

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

观点?

4

2 回答 2

2

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

这个问题可以帮助您应用 Code-Guru 的方程式。

于 2013-03-26T00:48:04.320 回答
2

圆的方程是

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

使用一点代数,您可以迭代xhh+r递增某个适当的范围,delta并计算 y 的两个对应值。这将绘制一个完整的圆圈。

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

更多细节:

要在不使用极坐标和三角函数的情况下绘制圆,您可以执行以下操作:

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)

要绘制圆弧而不是完整的圆,您只需更改thetafor 循环中的限制。例如,圆圈的左半部分从PI/23*PI/2

于 2013-03-26T00:35:28.200 回答