Исходник программы - класс, объектами которого являются естественные кубические сплайны по значениям в узлах с равномерным шагом на Си(C++)


Добавил:DMT
Дата создания:29 апреля 2008, 18:05
Дата обновления:29 апреля 2008, 18:05
Просмотров:7734 последний вчера, 0:42
Комментариев: 1
Исходник программы - класс, объектами которого являются естественные кубические сплайны по значениям в узлах с равномерным шагом на Си(C++)
Определить класс, объектами которого являются сплайны. Конструктор строит объект как естественный кубический сплайн по значениям в узлах с равномерным шагом.
Код на C++
  1. #include <iostream.h>
  2. #include <conio.h>
  3. #include <graphics.h>
  4. #include <math.h>
  5. #include "mouse.h"
  6. #include <stdio.h>
  7. #define BORD 1
  8. #define NO_BORD 0
  9. #define LEFT 40
  10. #define TOP 40
  11. #define RIGHT 150
  12. #define BOTTOM 150
  13. char gr=0;
  14. char *driv="c:\\temp\\bgi";
  15. struct wind//координаты окна
  16. {int l,t,dx,dy; };
  17. struct point//структура точки
  18. {int x,y;
  19. char c;};
  20. struct lin//структура линии
  21. {int x1,y1,x2,y2;
  22. char c;};
  23. class spline;//сплайн
  24. class graphic//класс графического вывода
  25. {wind w;//координаты окна
  26. char bord;//граница окна
  27. friend class spline;
  28. public:
  29. //конструктор
  30. graphic(int k1,int k2,int k3,int k4,char k5=NO_BORD)
  31. { if(gr==0)
  32. { int dr=VGA,mode=VGAHI;
  33. initgraph(&dr,&mode,driv); }
  34. w.l=k1;
  35. w.t=k2;
  36. w.dx=k3;
  37. w.dy=k4;
  38. bord=k5;
  39. gr=1;
  40. set();}
  41. //диструктор
  42. ~graphic(){};
  43. void clear(void) //очистка окна
  44. {setviewport(w.l,w.t,w.l+w.dx,w.t+w.dy,1);
  45. clearviewport();}
  46. void set(void) //подготовка окна
  47. {setviewport(w.l,w.t,w.l+w.dx,w.t+w.dy,1);
  48. if(bord!=NO_BORD)
  49. {setcolor(1);
  50. moveto(0,0);
  51. lineto(0,w.dy);
  52. lineto(w.dx,w.dy);
  53. lineto(w.dx,0);
  54. lineto(0,0);}}
  55. //вывод точки в окно с помощью операции <<
  56. friend graphic& operator << (graphic &out,point &p)
  57. {setviewport(out.w.l,out.w.t,out.w.l+out.w.dx,out.w.t+out.w.dy,1); putpixel(p.x,p.y,p.c);
  58. return out;
  59. }
  60. //вывод линии в окно с помощью операции <<
  61. friend graphic& operator << (graphic &out,lin &lin)
  62. {setviewport(out.w.l,out.w.t,out.w.l+out.w.dx,out.w.t+out.w.dy,1);
  63. setcolor(lin.c);
  64. line(lin.x1,lin.y1,lin.x2,lin.y2);
  65. return out;}};
  66. class spline
  67. {float A[4];//коэффициенты кубического сплайна
  68. float l,r;//левая и правая граница
  69. public:
  70. //конструктор
  71. spline(float left,float right,float *B)
  72. {l=left;
  73. r=right;
  74. if(l>r)//если левая больше правой
  75. { float temp=r;
  76. r=l;
  77. l=temp;}
  78. float X[4][5];
  79. float h,d;
  80. int i,j,k;
  81. h=(r-l)/3;//шаг
  82. //заполняем матрицу X
  83. for(i=0;i<4;i++)
  84. for(j=0;j<4;j++)
  85. {if(j==0)X[i][j]=1;
  86. else
  87. X[i][j]=pow(l+h*i,j);}
  88. for(i=0;i<4;i++)
  89. X[i][4]=B[i];
  90. //приводим матрицу к треугольному виду
  91. for(i=0;i<3;i++)
  92. for(j=i+1;j<4;j++)
  93. { d=X[j][i]/X[i][i];
  94. for(k=0;k<5;k++)
  95. X[j][k]-=d*X[i][k];}
  96. //обратная прогонка
  97. A[3]=X[3][4]/X[3][3];
  98. A[2]=(X[2][4]-A[3]*X[2][3])/X[2][2];
  99. A[1]=(X[1][4]-A[3]*X[1][3]-A[2]*X[1][2])/X[1][1];
  100. A[0]=(X[0][4]-A[3]*X[0][3]-A[2]*X[0][2]-A[1]*X[0][1])/X[0][0];}
  101. //диструктор
  102. ~spline(){delete []A};
  103. //вывод коэффициентов сплайна на экран
  104. friend ostream&operator<<(ostream &po,spline &p)
  105. {po<<p.A[0]<<"+"<<p.A[1]<<"*x+"<<p.A[2]<<"*x^2+"<<p.A[3]<<"*x^3";
  106. return po;}
  107. //кубический сплайн
  108. float f(float x)
  109. { return A[0]+A[1]*x+A[2]*x*x+A[3]*x*x*x;}
  110. //вывод графика в окно с помощью операции <<
  111. friend graphic& operator <<(graphic &out,spline &s)
  112. { float i;
  113. float h=(s.r-s.l)/out.w.dx,max=s.f(s.l),min=s.f(s.l),t,c;
  114. for(i=s.l;i<s.r;i+=h)
  115. { t=s.f(i);
  116. if(t>max)max=t;
  117. if(t<min)min=t; }
  118. c=(min+max)/2;//средняя линия графика
  119. lin xy;
  120. xy.c=RED;
  121. float cy=out.w.dy/(2*(max-c));//корректировка по y
  122. xy.x1=0;// первая
  123. xy.y1=out.w.dy/2-(s.f(s.l)-c)*cy;// точка
  124. float osx=-s.l/h;//оси
  125. float osy=out.w.dy/2+c*cy;
  126. lin yy={osx,0,osx,out.w.dy,8};
  127. lin xx={0,osy,out.w.dx,osy,8};
  128. out<<xx<<yy;
  129. for(xy.x2=0;xy.x2<=out.w.dx;xy.x2++)
  130. { xy.y2=out.w.dy/2-(s.f(h*xy.x2+s.l)-c)*cy;
  131. out<<xy;
  132. xy.x1=xy.x2;
  133. xy.y1=xy.y2; }
  134. return out;}};
  135. void main (void)
  136. {clrscr();
  137. float l,r;
  138. float a[4];
  139. cout<<"Введите границы по x\n"<<"Левая:";
  140. cin>>l;
  141. cout<<"Правая:";
  142. cin>>r;
  143. if(l>r)
  144. { float temp=l;
  145. l=r;
  146. r=temp;}
  147. cout<<"Введите точки\n";
  148. for(int i=0;i<4;i++)
  149. { cout<<i+1<<":";
  150. cin>>a[i];}
  151. //объект - сплайн
  152. spline s(l,r,a);
  153. //объект - окно
  154. graphic window(LEFT,TOP,RIGHT,BOTTOM,BORD);
  155. window<<s;
  156. gotoxy(1,20);
  157. printf("left click for exit");
  158. //с помощью мыши узнаем координаты точки на графике
  159. initmouse();
  160. show_cur(1);//показать курсор
  161. coor m;//координаты мыши
  162. float x,y;
  163. float h=(r-l)/RIGHT,max=s.f(l),min=s.f(l),t,c,ii;
  164. for(ii=l;ii<r;ii+=h)
  165. { t=s.f(ii);
  166. if(t>max)max=t;
  167. if(t<min)min=t; }
  168. c=(min+max)/2;
  169. //пока не нажали левую кнопку мыши
  170. while(mouse_mode()!=1)
  171. { m=get_xy();//получить координаты
  172. if(m.x>LEFT&&m.x<RIGHT+LEFT&&m.y>TOP&&m.y<BOTTOM+TOP)
  173. { x=(r-l)/RIGHT*(m.x-LEFT)+l;
  174. y=min-(m.y-BOTTOM-TOP)*(max-min)/BOTTOM;
  175. gotoxy(1,1);
  176. printf("%.2f,%.2f ",x,y); }}
  177. closegraph();
  178. }
При использовании обязательна ссылка на http://DMTSoft.ru
up

Комментарии для "Исходник программы - класс, объектами которого являются естественные кубические сплайны по значениям в узлах с равномерным шагом на Си(C++)"


Пользователь: borland
Сообщений: 1
Статус: Пользователь
Зарегистрирован:
8 декабря 2008, 20:33
Был:8 декабря 2008, 20:44
borland
smsup
Дата: 8 декабря 2008, 20:39 Сообщение № 1
Мне нужен этот кодsm