Расчёт пересечения прямой, луча и отрезка с канонической квадратичной кривой - C#

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

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

Уважаемые знатоки и гости "программы" ) ...прошу помочь хоть как нибудь, дайте примеры или код с любыми кординатами требуется сделать 3 кода: 1. Расчёт пересечения прямой, луча и отрезка с канонической квадратичной кривой. 2. Построение циклических интерполяционных полиномиальных кривых 3. Построение тени отрезка на отрезок от дальнего источника. Среда желательно Visual Studio 2013 - 2015

Решение задачи: «Расчёт пересечения прямой, луча и отрезка с канонической квадратичной кривой»

textual
Листинг программы
  1. #include "stdio.h"
  2. #include "conio.h"
  3. #include "graphics.h"
  4. #include "dos.h"
  5.  
  6. #define GD_DIR "C:\\BC31\\BGI"  // Директория egavga.bgi
  7. #define AMOUNT 30       // Максимальное количество узловых точек
  8.  
  9. // Вычисление ординаты точки методом интерполяционного полинома Лагранжа
  10. int CalcLagrange(double x, double *X, double *Y,int pts)   
  11. {
  12.     double y=0, lj;
  13.     for(int j=0;j<pts;j++)
  14.     {
  15.         lj=1;
  16.         for(int i=0;i<pts;i++)
  17.             if(i!=j)
  18.                 lj*=(x-X[i])/(X[j]-X[i]);
  19.         y+=Y[j]*lj;
  20.     }
  21.     return y;
  22. }
  23.  
  24. // Процедура рисования кривой
  25. void DrawCurve(double *X, double *Y, int pts)
  26. {
  27.     for(double x=X[0];x<X[pts-1];x+=0.1)
  28.         putpixel(x,CalcLagrange(x,X,Y,pts),LIGHTGREEN);
  29.  
  30. }
  31.  
  32. // Показать/спрятать курсор мыши
  33. void MouseShow(int s, struct REGPACK reg)
  34. {
  35.     if(s==0)
  36.     {
  37.         reg.r_ax=0x02;
  38.         intr(0x33,®);
  39.     }
  40.     else
  41.     {
  42.         reg.r_ax=0x01;
  43.         intr(0x33,®);
  44.     }
  45. }
  46.  
  47. int main()
  48. {
  49.     struct REGPACK reg;
  50.     int GD,GM;
  51.     int pts=0,  // Количество поставленных точек
  52.         put=0,  // Ограничитель
  53.         mp;     // Номер передвигаемой точки
  54.  
  55.  
  56.     double X[AMOUNT],Y[AMOUNT]; // Массивы X и Y координат точек
  57.  
  58.     GD=DETECT;
  59.  
  60.     reg.r_ax=0x00;     
  61.     intr(0x33,®);
  62.  
  63.     if(reg.r_ax!=0)
  64.     {
  65.         initgraph(&GD,&GM,GD_DIR);
  66.  
  67.         MouseShow(1,reg);
  68.  
  69.         reg.r_bx=1; // Необходимо для первого прохода цикла
  70.  
  71.         // Расстановка узловых точек, переход к черчению кривой по нажатию правой кнопки мыши
  72.  
  73.         while(reg.r_bx!=2)
  74.         {
  75.             reg.r_ax=0x03;
  76.             intr(0x33,®);
  77.  
  78.             if(reg.r_bx==1)
  79.             {
  80.                 if(put==0)  // Следующий блок выполняется один раз за одно нажатие левой кнопки мыши
  81.                 {
  82.                     // Поставить узел, записать его координаты
  83.  
  84.                     MouseShow(0,reg);
  85.  
  86.                     circle(reg.r_cx,reg.r_dx,2);
  87.  
  88.                     MouseShow(1,reg);
  89.  
  90.                     X[pts]=reg.r_cx;
  91.                     Y[pts]=reg.r_dx;
  92.  
  93.                     pts++;
  94.                     put=1;
  95.                 }
  96.             }
  97.             else
  98.                 put=0;
  99.         }
  100.  
  101.         DrawCurve(X,Y,pts);
  102.  
  103.         // Изменение кривой путём изменения положения узловых точек    
  104.  
  105.         while(!kbhit())
  106.         {
  107.             reg.r_ax=0x03;
  108.             intr(0x33,®);
  109.  
  110.             if(reg.r_bx==1)
  111.             {
  112.  
  113.                 if(put==0&&mp==256) //Нажата левая кнопка, и узловая точка ещё не выбрана
  114.                 {
  115.                     // Если курсор указывает на узловую точку, то определить её номер
  116.                     put=1;
  117.                     for(int l=0;l<pts;l++)
  118.                         if((X[l]+9>reg.r_cx)&&(X[l]-9<reg.r_cx)
  119.                          &&(Y[l]+9>reg.r_dx)&&(Y[l]-9<reg.r_dx))
  120.                              mp=l;
  121.                 }
  122.                 if(mp!=256) // Перетаскивание выбранной точки
  123.                 {
  124.                     MouseShow(0,reg);
  125.  
  126.                     X[mp]=reg.r_cx;
  127.                     Y[mp]=reg.r_dx-4;
  128.  
  129.                     cleardevice();
  130.  
  131.                     DrawCurve(X,Y,pts);
  132.  
  133.                     for(int j=0;j<pts;j++)
  134.                         circle(X[j],Y[j],2);
  135.  
  136.                     MouseShow(1,reg);
  137.  
  138.                     delay(10);
  139.                 }
  140.             }
  141.             else
  142.             {
  143.                 mp=256; // Узловая точка не выбрана
  144.                 put=0;
  145.             }
  146.         }
  147.  
  148.     }
  149.     else printf("Mouse is not installed.");
  150.     getch();
  151.     return 0;
  152. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

10   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы