Поворот линии по углу - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Задание следующее: просто повернуть радиус внутри окружности на опр градус. Вот написал код:
#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;
}
Значение угла задается на 46 строке. Но начиная с 1 градуса значения X и Y выводятся неправильно. Где тут ошибка?

Решение задачи: «Поворот линии по углу»

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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: , , , , .
  2. Объявляем переменные: midx, midy, graphs.
  3. Определяем функцию MID, которая вычисляет центр окна.
  4. В функции main() устанавливаем локаль на русский язык.
  5. Инициализируем графический драйвер и режим работы с графикой с помощью функции initgraph().
  6. Вызываем функцию MID для определения центра окна.
  7. Запрашиваем у пользователя количество масштабов и сохраняем его в переменную kl.
  8. Вычисляем шаг масштабирования и сохраняем его в переменную br.
  9. Отображаем эту информацию на экране.
  10. Устанавливаем цвет 8 для заливки прямоугольника и цвет 9 для контура.
  11. Отображаем прямоугольник размером 640x480 в центре окна.
  12. В цикле while, который выполняется до тех пор, пока kl не станет равным нулю, поворачиваем линию на экране по углу angle.
  13. Для каждого шага масштабирования вычисляем новые координаты X и Y.
  14. Отображаем эти координаты на экране.
  15. Строим линию между текущими координатами X и Y с помощью функции lineto().
  16. Уменьшаем значение kl на 1.
  17. Задерживаем экран с помощью функции getch().
  18. Закрываем графику с помощью функции closegraph().
  19. Возвращаем 0 из функции main(), что означает успешное выполнение программы.
  20. Завершаем список.

Оцени полезность:

14   голосов , оценка 3.714 из 5
Похожие ответы