Расчёт пересечения прямой, луча и отрезка с канонической квадратичной кривой - C#
Формулировка задачи:
Уважаемые знатоки и гости "программы" ) ...прошу помочь хоть как нибудь, дайте примеры или код с любыми кординатами
требуется сделать 3 кода:
1. Расчёт пересечения прямой, луча и отрезка с канонической квадратичной кривой.
2. Построение циклических интерполяционных полиномиальных кривых
3. Построение тени отрезка на отрезок от дальнего источника.
Среда желательно Visual Studio 2013 - 2015
Решение задачи: «Расчёт пересечения прямой, луча и отрезка с канонической квадратичной кривой»
textual
Листинг программы
- #include "stdio.h"
- #include "conio.h"
- #include "graphics.h"
- #include "dos.h"
- #define GD_DIR "C:\\BC31\\BGI" // Директория egavga.bgi
- #define AMOUNT 30 // Максимальное количество узловых точек
- // Вычисление ординаты точки методом интерполяционного полинома Лагранжа
- int CalcLagrange(double x, double *X, double *Y,int pts)
- {
- double y=0, lj;
- for(int j=0;j<pts;j++)
- {
- lj=1;
- for(int i=0;i<pts;i++)
- if(i!=j)
- lj*=(x-X[i])/(X[j]-X[i]);
- y+=Y[j]*lj;
- }
- return y;
- }
- // Процедура рисования кривой
- void DrawCurve(double *X, double *Y, int pts)
- {
- for(double x=X[0];x<X[pts-1];x+=0.1)
- putpixel(x,CalcLagrange(x,X,Y,pts),LIGHTGREEN);
- }
- // Показать/спрятать курсор мыши
- void MouseShow(int s, struct REGPACK reg)
- {
- if(s==0)
- {
- reg.r_ax=0x02;
- intr(0x33,®);
- }
- else
- {
- reg.r_ax=0x01;
- intr(0x33,®);
- }
- }
- int main()
- {
- struct REGPACK reg;
- int GD,GM;
- int pts=0, // Количество поставленных точек
- put=0, // Ограничитель
- mp; // Номер передвигаемой точки
- double X[AMOUNT],Y[AMOUNT]; // Массивы X и Y координат точек
- GD=DETECT;
- reg.r_ax=0x00;
- intr(0x33,®);
- if(reg.r_ax!=0)
- {
- initgraph(&GD,&GM,GD_DIR);
- MouseShow(1,reg);
- reg.r_bx=1; // Необходимо для первого прохода цикла
- // Расстановка узловых точек, переход к черчению кривой по нажатию правой кнопки мыши
- while(reg.r_bx!=2)
- {
- reg.r_ax=0x03;
- intr(0x33,®);
- if(reg.r_bx==1)
- {
- if(put==0) // Следующий блок выполняется один раз за одно нажатие левой кнопки мыши
- {
- // Поставить узел, записать его координаты
- MouseShow(0,reg);
- circle(reg.r_cx,reg.r_dx,2);
- MouseShow(1,reg);
- X[pts]=reg.r_cx;
- Y[pts]=reg.r_dx;
- pts++;
- put=1;
- }
- }
- else
- put=0;
- }
- DrawCurve(X,Y,pts);
- // Изменение кривой путём изменения положения узловых точек
- while(!kbhit())
- {
- reg.r_ax=0x03;
- intr(0x33,®);
- if(reg.r_bx==1)
- {
- if(put==0&&mp==256) //Нажата левая кнопка, и узловая точка ещё не выбрана
- {
- // Если курсор указывает на узловую точку, то определить её номер
- put=1;
- for(int l=0;l<pts;l++)
- if((X[l]+9>reg.r_cx)&&(X[l]-9<reg.r_cx)
- &&(Y[l]+9>reg.r_dx)&&(Y[l]-9<reg.r_dx))
- mp=l;
- }
- if(mp!=256) // Перетаскивание выбранной точки
- {
- MouseShow(0,reg);
- X[mp]=reg.r_cx;
- Y[mp]=reg.r_dx-4;
- cleardevice();
- DrawCurve(X,Y,pts);
- for(int j=0;j<pts;j++)
- circle(X[j],Y[j],2);
- MouseShow(1,reg);
- delay(10);
- }
- }
- else
- {
- mp=256; // Узловая точка не выбрана
- put=0;
- }
- }
- }
- else printf("Mouse is not installed.");
- getch();
- return 0;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д