Поворот линии по углу - C (СИ)
Формулировка задачи:
Задание следующее: просто повернуть радиус внутри окружности на опр градус.
Вот написал код:
Значение угла задается на 46 строке. Но начиная с 1 градуса значения X и Y выводятся неправильно. Где тут ошибка?
#include <graphics.h> #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <math.h> int midx, midy; struct MyPoint { float x,y; }A; void MID(void) { midx = getmaxx() / 2; //определяем центр окна midy = getmaxy() / 2; } int main() { setlocale(LC_ALL,"Russian"); int gdriver = DETECT, gmode, errorcode; int i,kl=0; initgraph(&gdriver, &gmode, ""); MID();//центр окна находим printf(" %d %d\n",midx,midy); printf("Enter number of scale: "); scanf("%d", &kl); setcolor(8); bar(midx-320, midy-240, midx+320, midy+240); setcolor(9); moveto(midx,midy); circle(midx,midy,1); circle(midx,midy,150); float angle=180; //Задаем угол поворота int X,Y; //moveto(midx,midy); Y=midy+(sin(angle))*150; //координаты для поворота X=midx+(cos(angle))*150; printf("%f %f - %d %d",X,Y,midx,midy); moveto(midx,midy); lineto(float(X),float(Y)); for (int i=0;i<kl;i++) { } getch(); //для задержки экрана closegraph(); return 0; }
Решение задачи: «Поворот линии по углу»
textual
Листинг программы
#include <graphics.h> #include <stdio.h> #include <stdlib.h> #include <locale.h> #include <math.h> int midx, midy; struct index_graph { int index; struct XY1 { int X,Y; }XY; }graphs; void MID(void) { midx = getmaxx() / 2; //определяем центр окна midy = getmaxy() / 2; } int main() { setlocale(LC_ALL,"Russian"); int gdriver = DETECT, gmode, errorcode; int i,kl=0; initgraph(&gdriver, &gmode, ""); MID();//центр окна находим printf("Enter number of scale: "); scanf("%d", &kl); float br=360/kl; printf("!!!%d!!!-%d-!!!",br,kl); setcolor(8); bar(midx-320, midy-240, midx+320, midy+240); setcolor(9); moveto(midx,midy); //поставили курсов circle(midx,midy,1); circle(midx,midy,150); //от нажатого курсора провели линию float angle=270; float Y=midy+(sin(angle))*150; float X=midx+(cos(angle))*150; while(kl!=0) { moveto(midx,midy); angle = angle-br; angle = angle / 180 * M_PI; Y=midy+(sin(angle))*150; X=midx+(cos(angle))*150; printf("%f %f - %d",X,Y,br); lineto(float(X),float(Y)); kl--; printf("\n"); } getch(); //для задержки экрана closegraph(); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , , , . - Объявляем переменные: midx, midy, graphs.
- Определяем функцию MID, которая вычисляет центр окна.
- В функции main() устанавливаем локаль на русский язык.
- Инициализируем графический драйвер и режим работы с графикой с помощью функции initgraph().
- Вызываем функцию MID для определения центра окна.
- Запрашиваем у пользователя количество масштабов и сохраняем его в переменную kl.
- Вычисляем шаг масштабирования и сохраняем его в переменную br.
- Отображаем эту информацию на экране.
- Устанавливаем цвет 8 для заливки прямоугольника и цвет 9 для контура.
- Отображаем прямоугольник размером 640x480 в центре окна.
- В цикле while, который выполняется до тех пор, пока kl не станет равным нулю, поворачиваем линию на экране по углу angle.
- Для каждого шага масштабирования вычисляем новые координаты X и Y.
- Отображаем эти координаты на экране.
- Строим линию между текущими координатами X и Y с помощью функции lineto().
- Уменьшаем значение kl на 1.
- Задерживаем экран с помощью функции getch().
- Закрываем графику с помощью функции closegraph().
- Возвращаем 0 из функции main(), что означает успешное выполнение программы.
- Завершаем список.