Рисование окружностей по диагонали в C ++ - PullRequest
1 голос
/ 01 марта 2012

Я работаю над этим уже около часа и не могу понять, что я делаю неправильно. Это постановка задачи:

Нарисуйте серию кругов вдоль одной диагонали окна. Круги должны быть разных цветов и каждый круг должен касаться (но не перекрытие) выше и ниже. Разрешить пользователю программы определить, сколько кругов нужно нарисовать.

Вот некоторые подсказки, которые мне дали:

Вы найдете геометрию, используемую для размещения геометрических элементов на диагонали легче, если вы сделаете свое окно квадратным. Вместо того, чтобы использовать getmaxheight () и getmaxwidth (), рассмотрите возможность использования getmaxheight () для оба размера.

Не забывайте теорему Пифагора при расчете расстояний в ваш код, такой как длина диагонали. Имейте в виду, хотя, что единицы на экране являются пикселями, поэтому дроби в расчеты не слишком полезны. Это определенно место для целочисленная арифметика.

Используйте количество элементов, которые вы собираетесь нарисовать (квадраты, круги, и т. д.) разделить общую длину на шаги, чтобы ваши петли работали с.

Используйте для циклов для рисования фигур, когда вы знаете, сколько рисовать и что Размер они должны быть. Определите количество и размер перед циклом.

Пока это код, который я создал. При вводе 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 Ответ

4 голосов
/ 01 марта 2012

Вот диаграмма того, что, я думаю, вы хотите:

enter image description here

Основная проблема сводится к определению

  1. Какой диаметр D каждого круга равен
  2. Где центр каждого круга.

Диаметр прост. Сначала вычислите длину L диагонали, используя теорему Пифагора, а затем разделите на требуемое количество кружков N. Конечно, если вам нужен радиус, просто разделите снова на 2.

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

Хитрость в определении положения центров окружностей заключается в том, чтобы понять, что X равномерно распределены вдоль оси X, и то же самое с координатами Y - так что вы можете определить расстояния, которые я обозначил 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 */
}

Вот и все!

Кстати, если вам интересно, почему ваш код отрисовывает круги дальше друг от друга, причина в том, что вы добавляли D к centerX и centerY вместо Dx и Dy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...