【问题标题】:Points on a circle, with limits. How To calculate without angle, but radius and centre point?圆上的点,有限制。如何计算没有角度,但半径和中心点?
【发布时间】:2013-03-26 00:29:30
【问题描述】:

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

我的问题是,我的任务是绘制这个形状,


(来源:learnersdictionary.com

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

重要细节。

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

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

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

我知道最大半径是 165 毫米,最小是 35 毫米。我决定我的基数Font Size 应该是 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;
}

现在,就我的一生而言,我无法找出一个方程式来计算分数。我找到了involve angles 的方程式,但因为我没有,所以我很挣扎。

本质上,我在这里尝试计算点“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<<")";
}

意见?

【问题讨论】:

  • 什么决定了交点的位置?是随意的吗?
  • 或者说得更好,有效形状的准确标准是什么?
  • 另外,(在没有精确标准的情况下),我不明白为什么内段的半径需要更大?一个较大的圆可以像一个较小的圆一样容易地与外圆相交。
  • @JBentley 我的假设是它们是具有给定中心和半径的两个圆。
  • 我想如果我把外线做成一个半圆,然后你就会知道使用上面显示的方程的半径,那么内线可以在起点和终点相交(可以很容易地计算出)的半圆?因为那时我可以限制内线可以达到的 Y 值?有帮助吗?

标签: c++ excel geometry


【解决方案1】:

根据 Code-Guru 在问题上的 cmets,内圈看起来比外圈更像一个半圈。使用 Code-Guru 答案中的方程式计算内圈的点。然后,查看this question,了解如何计算与您的圆相交的圆的半径,给定距离(您可以任意设置)和交点(您知道,因为它是一个半圆)。从此,您可以绘制任意给定距离的外圆弧,您所需要做的就是改变距离,直到生成您满意的形状。

This question 可以帮助你应用 Code-Guru 的方程式。

【讨论】:

  • 谢谢,试试看。
  • 我正在努力创建一个增量,它将遍历圆圈中的所有值。还有其他提示吗?
  • @Craig 你说的“圈子里的所有值”是什么意思?
  • @Craig Code-Guru 的意思是一个圆有无数个点。您需要确定要显示的合理点数,然后只计算这些点数。
  • @Craig 我用一个可以帮助您解决 Code-Guru 方程式的问题编辑了我的答案。
【解决方案2】:

圆的方程是

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

通过一点代数,您可以在从hh+r 的范围内迭代x,以适当的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)

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

【讨论】:

  • @Craig 当我写“迭代 x...”时,我想到了一个 for 循环。你需要决定增加多少 x。您可以简单地增加 1 (++x) 或其他值 (x += delta),具体取决于您使用的单位以及您需要的近似值与实际圆的接近程度。
  • @Craig 你之前的评论在我有机会评论你如何解方程之前就消失了。我假设你发现结果有问题。一方面,我没有在结果中看到任何 y 值。让我们随时了解您对我们的看法,尤其是在您需要更多帮助时。
  • 啊!我现在明白了,并没有真正理解为每个 x 值计算 Y 的两个值......抱歉迟到了,注意力不集中。对于那个很抱歉。但是,是的,谢谢,会试一试,看看会发生什么。同意二次方可能很混乱,但至少我知道我会得到两个(希望是)正确的值。再次感谢,我会随时通知您。
  • @Craig 我已经编辑了我的答案,其中包含一些关于使用 trig 解决问题的想法。如果您了解基础知识,这比使用二次公式要干净得多。
  • 使用你最新的代码,有没有办法选择点数?该代码有效,但仅显示 4 个点
猜你喜欢
  • 2016-07-26
  • 2021-04-09
  • 2014-05-12
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2012-12-15
相关资源
最近更新 更多