在C ++中用对角线绘制圆圈

时间:2012-03-01 02:08:18

标签: c++ graphics geometry

我现在已经工作了大约一个小时了,我无法弄清楚我做错了什么。这是问题的问题陈述:

  

沿窗口的一个对角线绘制一系列圆圈。圈子   应该是不同的颜色,每个圆圈应该触摸(但不是   重叠)它上面和下面的那个。允许程序用户   确定要绘制的圆圈数。

这些是给我的一些提示:

  

您将找到放置几何元素所涉及的几何体   如果你把窗户做成正方形,对角线会更容易。而不是使用   getmaxheight()和getmaxwidth(),考虑使用getmaxheight()   两个方面。

     

在计算距离时不要忘记毕达哥拉斯定理   你的代码,如对角线的长度。但请记住,   屏幕上的单位是像素,所以分数在   计算不太有用。这绝对是一个地方   整数运算。

     

使用您要绘制的元素数量(正方形,圆形,   等)将总长度分成循环工作的步骤   用。

     

当您知道要绘制多少数字时,使用for循环来绘制数字   它们的大小。确定循环前的计数和大小。

到目前为止,这是我创建的代码。输入4个圆圈仅在屏幕上绘制3个,第三个圆圈部分在屏幕外。圆圈也没有碰到,这对我来说没有任何意义,因为将下一个圆圈的中心向下移动直到整个直径的长度应该让两个圆圈接触。这是我的代码:

#include <graphics.h>
#include <cmath>
#include <iostream>

using namespace std;

int main()
{
   int foreColor;
   int diagLength;
   int radius,diameter;
   int centerX = 0, centerY = 0;
   int numCircles;              // number of circles.
   int width, height;           // screen width and height

   cout << "Enter number of circles: ";
   cin >> numCircles;

   width = getmaxheight();
   height = getmaxheight();

   initwindow(width, height, "Circles");

   diagLength = sqrt((width * width) + (height * height));
   diameter = diagLength / numCircles;
   radius = diameter / 2;
   centerX = radius;
   centerY = radius;

   for (int i = 1; i <= numCircles; i++)
   {
      foreColor = i % 16;                // 0 <= foreColor <= 15
      setcolor(foreColor);
      setfillstyle(i % 12, foreColor);   // Set fill style
      fillellipse(centerX, centerY, radius, radius);

      centerX = centerX + diameter;
      centerY = centerY + diameter;
   }

   getch();       // pause for user
   closegraph();

}

1 个答案:

答案 0 :(得分:4)

这是我认为你想要的图表:

enter image description here

基本问题归结为确定

  1. 每个圆圈的直径D
  2. 每个圆圈的中心位置。
  3. 直径很容易。首先使用毕达哥拉斯定理计算对角线的长度L,然后除以所需的圆圈数N。当然,如果你需要半径再次除以2。

    L = Sqrt(Width * Width + Height * Height);
    D = L / N;
    

    计算圆心的位置的技巧是要意识到X沿X轴均匀分布,与Y坐标相同 - 这样你就可以计算出我标记为{{1}的距离和Dx非常容易使用相同的部门:

    Dy

    从那里可以很容易地计算每个圆圈的中心:

    Dx = Width / N;
    Dy = Height / N;
    

    这就是它的全部!

    顺便说一句,如果您想知道为什么您的代码将圈子划分得比它们应该更远,原因是您要将for (i = 0; i < N; i++) { centerX = (Dx / 2) + i * Dx; centerY = (Dy / 2) + i * Dy; /* Draw the circle at (centerX, centerY) with diameter D */ } 添加到DcenterX而不是centerYDx