Программа построения окружностей двумя способами.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Здравствуйте. Мне нужна помощь с построением окружности в С++.
Первый способ. Нужно рассмотреть окружность с центром в начале координат, для которой x^2+y^2=R^2.
x = Rcos(a)
y = Rsin(a)
И вот начальный код программы, который был указан в методичке, только я понятия не имею что с ним делать.
void Circle (int x, int y, int R, int color)
{
int a;
int x1;
int x2;
int y1;
int y2;
x2=x+R;
y2=y;
for ( int a=1; a<=360; a++)
{
x1=x2; y1=y2;
x2=round(Rcos(a))+x;
y2=round(Rsin(a))+x;
Line (x1, y1, x2, y2, color);
} }
Второй способ. Построение окружности по 8-ми точкам.
"Если воспользоваться симметрией окружности, то можно построить более эффективный
алгоритм. Если точка (x, y) лежит на окружности, то легко вычислить семь точек, принадлежащих окружности, симметричных этой. То есть, имея функцию вычисления значения y по x 0..R/sqrt(2) для построения дуги от 0 до 45 градусов. Построим процедуру, которая будет по одной координате ставить восемь точек, симметричных центру окружности". (Это текст из той же методички).
И вот пример кода для второго способа.
void Circle_Pixel(int x0, int y0, int x, int y, int color);
{
putpixel(x0 + x, y0 + y, color);
putpixel(x0 + y, y0 + x, color);
putpixel(x0 + y, y0 — x, color);
putpixel(x0 + x, y0 — y, color);
putpixel(x0 — x, y0 — y, color);
putpixel(x0 — y, y0 — x, color);
putpixel(x0 — y, y0 + x, color);
putpixel(x0 — x, y0 + y, color);
}
...
void Circle (int x0, int y0, int R, int color)
{
for ( int x=0; x<=R/sqrt(2); x++)
{
int y = (int)(sqrt(sqr(R)-sqr(x)));
Circle_Pixel (x0, y0, x, y, color);
}
}
Я долго искал на просторах интернета что-нибудь об этом, но безуспешно. Единственное что я узнал, это то что в С++ нужно переходить в графический режим.
Помогите пожалуйста разобраться.
Palch, во-первых, для автора методички в аду уже готов персональный котел. Во-вторых, тебе нужно было в школе учить математику. В принципе на этом можно было бы и закончить...
Видимо методичка подразумевает использование ветхозаветного Borland C++ под DOS. (Для своего времени это был отличная IDE и отличный компилятор, но сейчас они несколько устарели.) Программы обычно писались для работы в текстовом режиме, но и была библиотечка, которая переводила видеоадаптер в графический режим. Функция
putpixel(int x, int y, int color)
— изменение цвета пикселя в указанной позиции. Функцияline(int x1, int y1, int x2, int y2)
— нарисовать отрезок из точки (x1, y1) в точку (x2, y2) текущим цветом. ФункцияLine
с пятью аргументами — видимо самопал автора методички.Кое-что по борландовской библиотеке можно почитать здесь в разделе Библиотечн. функции Borland C++.
Первый способ — это вычисление в цикле координат 360 точек на окружности (через каждый градус) и постороение линий, которые соединяют каждую пару точек. (Т.е. получается аппроксимация окружности отрезками прямых.) Аргументы x и y функции Circle задают смещение центра окружности относительно начала координат.
В примере кода имеются две ошибки. Первая — при вычислении y2 нужно прибавлять y, а не x. Вторая — автор не учел, что функции
sin()
иcos()
получают аргумент в радианах, а не в градусах.Второй способ — вычисление в цикле координат точек на 1/8 части окружности с помощью теоремы Пифагора (в функции Circle) и отзеркаливание их относительно осей координат, связанных с центром окружности (в функции Circle_Pixel). В вычисленных точках изменяется цвет пикселей на экране. Аргументы x0, y0 задают смещение центра окружности относительно начала координат.
За такой винегрет из int и double надо убивать медленно.
sam, Спасибо вам большое за ваш ответ. Вы дали больше полезной информации, чем эти бесполезные методички.