Advertisement
Guest User

Untitled

a guest
Nov 29th, 2015
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.64 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace WindowsFormsApplication2
  12. {
  13. public partial class Form1 : Form
  14. {
  15.  
  16. float xmin = float.MaxValue,//минимальная точка
  17. xmax = float.MinValue,//максимальная точка
  18. ymin = float.MaxValue,//минимальное значение функции
  19. ymax = float.MinValue,//максимальное значение функции
  20. xmin1 = float.MaxValue,//минимальная точка производной
  21. xmax1 = float.MinValue,//максимальная точка производной
  22. ymin1 = float.MaxValue,//минимальное значение производной функции
  23. ymax1 = float.MinValue;//максимальное значение производной функции
  24.  
  25. Pen pen1 = new Pen(Color.Red);//"кисть" для рисования графика
  26. Pen pen2 = new Pen(Color.Black);//"кисть" для рисования координатнй плоскости
  27. Pen pen3 = new Pen(Color.Blue);//"кисть" для рисования производной графика
  28. Pen pen4 = new Pen(Color.Green);//"кисть" для выделения промежутков
  29.  
  30. int button4_priznak = 0;//состояние кнопки "Подсвечивание промежутков"
  31. int priznak = 0;//признак выделения цветами промежутки F(x) > 0 и F'(x) < 0
  32. double dx = 0.13;//параметр для вычисления производной
  33. string a = "1";//параметр в заданной функции
  34. double b = 2;
  35. double delta = 0.01; //частота точек на графике
  36. int state = 0; //состояние программы
  37. int p1 = int.MaxValue;//индекс первой точки первого разрыва в общем массиве
  38. int p2 = int.MaxValue;//индекс второй точки разрыва в общем массиве
  39. int p11 = 0;//индекс последней точки первого разрыва в общем массиве
  40. int p22 = 0;//индекс последней точки второго разрыва в общем массиве
  41. int pr1 = int.MaxValue;//индекс первой точки первого разрыва производной в общем массиве
  42. int pr2 = int.MaxValue;//индекс второй точки второго разрыва производной в общем массиве
  43. int pr11 = 0;//индекс последней точки первого разрыва производной в общем массиве
  44. int pr22 = 0;//индекс последней точки второго разрыва производной в общем массиве
  45. float[] arx1 = new float[2000];//массив подставленный точек производной
  46. float[] ary1 = new float[2000];//массив значений в подставленных точках производной
  47. float[] arx = new float[2000];//массив подставленный точек
  48. float[] ary = new float[2000];//массив значений в подставленных точках
  49. bool[] t = new bool[2000];
  50. Graphics gr; // Контекст изображения ("холст")
  51.  
  52. public Form1()
  53. {
  54. InitializeComponent();
  55.  
  56. string[] d = new string[201]; //начало заполнения комбобокса параметрами
  57. int j = 0;
  58. for (double i = -10; i < 10; i += 0.1, j++)
  59. {
  60. d[j] = i.ToString("f1");
  61. }
  62. comboBox1.Items.AddRange(d); //конец заполнения комбобокса параметрами
  63. }//Form1
  64.  
  65. private void pictureBox1_Paint(object sender, PaintEventArgs e)//рисование на picterbox1
  66. {
  67. gr = e.Graphics;
  68. if (state % 2 == 0) return;
  69.  
  70. int xMax, yMax;
  71. xMax = pictureBox1.Width;//ширина холста
  72. yMax = pictureBox1.Height;//высота холста
  73.  
  74. gr.Clear(Color.White); // стереть график
  75.  
  76. //Pen pen2 = MyFunction.Color_Choice();//выбор цвета
  77.  
  78. float q1 = 0, s1 = pictureBox1.Height / 2, q2 = pictureBox1.Width, s2 = pictureBox1.Height / 2;
  79. gr.DrawLine(pen2, q1, s1, q2, s2);
  80. float z1 = pictureBox1.Width / 2, v1 = 0, z2 = pictureBox1.Width / 2, v2 = pictureBox1.Height;
  81. gr.DrawLine(pen2, z1, v1, z2, v2);
  82.  
  83. //масштабирование
  84. float beta = xMax / (xmax - xmin);//единичный отрезок по Х
  85. float gama = yMax / (ymax - ymin) * 75;//единичный отрезок по У
  86.  
  87. //Pen pen1 = MyFunction.Color_Choice();//выбор цвета
  88.  
  89. for (int k = 0; k < 1999;)
  90. {
  91. if (t[k + 1] == false | t[k] == false)
  92. k++;
  93. else
  94. {
  95. float x1 = arx[k],
  96. x2 = arx[k + 1],
  97. y1 = ary[k],
  98. y2 = ary[k + 1];
  99.  
  100. x1 = (-xmin + x1) * beta;
  101. x2 = (-xmin + x2) * beta;
  102. y1 = pictureBox1.Height / 2 - y1 * gama;
  103. y2 = pictureBox1.Height / 2 - y2 * gama;
  104.  
  105. gr.DrawLine(Pens.Red, x1, y1, x2, y2);
  106. k++;
  107. }
  108. }
  109. /*
  110. for (int k = 0; k < n - 1;)
  111. {
  112. if (fd[k + 1] == false | fd[k] == false)
  113. k++;
  114. else
  115. {
  116. float x1 = xd[k], x2 = xd[k + 1], y1 = yd[k], y2 = yd[k + 1];
  117. x1 = (x1 - xmind) * xdscale;
  118. y1 = h / 2 - y1 * ydscale;
  119. x2 = (x2 - xmind) * xdscale;
  120. y2 = h / 2 - y2 * ydscale;
  121. gr.DrawLine(Pens.Blue, x1, y1, x2, y2);
  122. k++;
  123. }
  124. }*/
  125.  
  126. /*
  127. for (int k = 0; k < p1; k++) //рисуем график заданной функции до первой точки разрыва
  128. {
  129. float x1 = arx[k],
  130. x2 = arx[k + 1],
  131. y1 = ary[k],
  132. y2 = ary[k + 1];
  133.  
  134. //смещение точек для специфической координатной плоскости picterbox1
  135. x1 = (-xmin + x1) * beta;
  136. x2 = (-xmin + x2) * beta;
  137. y1 = pictureBox1.Height / 2 - y1 * gama;
  138. y2 = pictureBox1.Height / 2 - y2 * gama;
  139.  
  140. gr.DrawLine(pen1, x1, y1, x2, y2);//прорисовка точек с соответсвующими координатами
  141.  
  142. } // end for
  143.  
  144. for (int k = p1 + 1; k < p2; k++) //рисуем график заданной функции после первой точки разрыва до второй
  145. {
  146. float x1 = arx[k],
  147. x2 = arx[k + 1],
  148. y1 = ary[k],
  149. y2 = ary[k + 1];
  150.  
  151. //смещение точек для специфической координатной плоскости picterbox1
  152. x1 = (-xmin + x1) * beta;
  153. x2 = (-xmin + x2) * beta;
  154. y1 = pictureBox1.Height / 2 - y1 * gama;
  155. y2 = pictureBox1.Height / 2 - y2 * gama;
  156.  
  157. gr.DrawLine(pen1, x1, y1, x2, y2);
  158.  
  159. } // end for
  160.  
  161. for (int k = p2 + 1; k < arx.Length - 2; k++) //рисуем график заданной функции после последней точки разрыва
  162. {
  163. float x1 = arx[k],
  164. x2 = arx[k + 1],
  165. y1 = ary[k],
  166. y2 = ary[k + 1];
  167.  
  168. //смещение точек для специфической координатной плоскости picterbox1
  169. x1 = (-xmin + x1) * beta;
  170. x2 = (-xmin + x2) * beta;
  171. y1 = pictureBox1.Height / 2 - y1 * gama;
  172. y2 = pictureBox1.Height / 2 - y2 * gama;
  173.  
  174. gr.DrawLine(pen1, x1, y1, x2, y2);
  175.  
  176. // end for
  177. }//end if
  178. // float beta1 = xMax / (xmax1 - xmin1);//единичный отрезок по Х
  179. // float gama1 = yMax / (ymax1 - ymin1);//единичный отрезок по У
  180.  
  181. //Pen pen3 = MyFunction.Color_Choice();
  182. /*
  183. for (int k = 0; k < pr1 - 2; k++) //рисуем график производной заданной функции до первой точки разрыва
  184. {
  185. float x1 = arx1[k],
  186. x2 = arx1[k + 1],
  187. y1 = ary1[k],
  188. y2 = ary1[k + 1];
  189.  
  190. //смещение точек для специфической координатной плоскости picterbox1
  191. x1 = (-xmin1 + x1) * beta;
  192. x2 = (-xmin1 + x2) * beta;
  193. y1 = pictureBox1.Height / 2 - y1 * gama;
  194. y2 = pictureBox1.Height / 2 - y2 * gama; //(ymax - y2) * gama;
  195.  
  196. gr.DrawLine(pen3, x1, y1, x2, y2);
  197.  
  198. } // end for
  199.  
  200. for (int k = pr1; k < pr2 - 2; k++) //рисуем график производной заданной функции после первой точки разрыва до второй
  201. {
  202. float x1 = arx1[k],
  203. x2 = arx1[k + 1],
  204. y1 = ary1[k],
  205. y2 = ary1[k + 1];
  206.  
  207. //смещение точек для специфической координатной плоскости picterbox1
  208. x1 = (-xmin1 + x1) * beta;
  209. x2 = (-xmin1 + x2) * beta;
  210. y1 = pictureBox1.Height / 2 - y1 * gama;
  211. y2 = pictureBox1.Height / 2 - y2 * gama;
  212.  
  213. gr.DrawLine(pen3, x1, y1, x2, y2);
  214.  
  215. }// end for
  216.  
  217. for (int k = pr2 + 1; k < arx1.Length - 2; k++) //рисуем график производной заданной функции после последней точки разрыва
  218. {
  219. float x1 = arx1[k],
  220. x2 = arx1[k + 1],
  221. y1 = ary1[k],
  222. y2 = ary1[k + 1];
  223.  
  224. //смещение точек для специфической координатной плоскости picterbox1
  225. x1 = (-xmin1 + x1) * beta;
  226. x2 = (-xmin1 + x2) * beta;
  227. y1 = pictureBox1.Height / 2 - y1 * gama;
  228. y2 = pictureBox1.Height / 2 - y2 * gama; //(ymax - y2) * gama;
  229.  
  230. gr.DrawLine(pen3, x1, y1, x2, y2);
  231.  
  232. }// end for
  233.  
  234. //Pen pen4 = MyFunction.Color_Choice();
  235.  
  236. if (priznak % 2 != 0)
  237. {
  238. for (int k = 0; k < ary.Length - 1; k++)
  239. {
  240. if ((k == p1) & (k == p2)) continue;
  241.  
  242. if ((ary[k] > 0) & (ary[k + 1] > 0))
  243. {
  244. float x1 = arx[k],
  245. x2 = arx[k + 1],
  246. y1 = ary[k],
  247. y2 = ary[k + 1];
  248.  
  249. x1 = (-xmin + x1) * beta;
  250. x2 = (-xmin + x2) * beta;
  251. y1 = pictureBox1.Height / 2 - y1 * gama;
  252. y2 = pictureBox1.Height / 2 - y2 * gama;
  253.  
  254. gr.DrawLine(pen4, x1, y1, x2, y2);
  255.  
  256. }//end if
  257.  
  258. if ((k == pr1) & (k == pr2)) continue;
  259.  
  260. if ((ary1[k] < 0) & (ary1[k + 1] < 0))
  261. {
  262. float x1 = arx1[k],
  263. x2 = arx1[k + 1],
  264. y1 = ary1[k],
  265. y2 = ary1[k + 1];
  266.  
  267. x1 = (-xmin1 + x1) * beta;
  268. x2 = (-xmin1 + x2) * beta;
  269. y1 = pictureBox1.Height / 2 - y1 * gama;
  270. y2 = pictureBox1.Height / 2 - y2 * gama;
  271.  
  272. gr.DrawLine(pen4, x1, y1, x2, y2);
  273. }
  274. }//end for
  275. } //end if priznak*/
  276. }//end picturebox1.Paint
  277.  
  278. private void button4_Click(object sender, EventArgs e)//выделение цветом установленных областей
  279. {
  280. /*MessageBox.Show(" Выберите цвет для выделения областей ");
  281. Pen pen4 = MyFunction.Color_Choice();//выбор цвета для выделения областей
  282. */
  283.  
  284. priznak++;
  285. button4_priznak++;//переключение состояния данной кнопки
  286. if (priznak % 2 == 0)
  287. {
  288. button4.Text = "Подсветить промежутки";
  289. gr = pictureBox1.CreateGraphics();
  290. pictureBox1.Invalidate();//убрать подсвечивание промежутков
  291. return;
  292. }
  293. button4.Text = "Стереть график";
  294. pictureBox1.Invalidate();
  295. }
  296.  
  297. private void button1_Click(object sender, EventArgs e)//прорисовка графика и его удаление
  298. {
  299.  
  300. /*MessageBox.Show(" Выберите цвет для прорисовки координатной плоскости ");
  301. Pen pen2 = MyFunction.Color_Choice();//выбор цвета для координатной плоскости
  302. MessageBox.Show(" Выберите цвет для прорисовки графика ");
  303. Pen pen1 = MyFunction.Color_Choice();//выбор цвета для графика
  304. MessageBox.Show(" Выберите цвет для прорисовки производной графика ");
  305. Pen pen3 = MyFunction.Color_Choice();//выбор цвета для производной графика
  306. */
  307.  
  308. state++;
  309. if (state % 2 == 0)
  310. {
  311. button1.Text = "Построить график";
  312. gr = pictureBox1.CreateGraphics();
  313. gr.Clear(Color.AntiqueWhite); //стерание графика
  314. if (button4_priznak % 2 == 1)//проверка: была ли нажата кнопка "Подсветка"
  315. {
  316. button4_priznak++;
  317. priznak++;
  318. }
  319. return;
  320.  
  321. }
  322. button1.Text = "Стереть график";
  323. button4.Text = "Подсветить промежутки";
  324. pictureBox1.Invalidate();
  325. }
  326.  
  327. private void button2_Click(object sender, EventArgs e)//установление дефолтных параметров
  328. {
  329. xmin = float.MaxValue;//минимальная точка
  330. xmax = float.MinValue;//максимальная точка
  331. ymin = float.MaxValue;//минимальное значение функции
  332. ymax = float.MinValue;//максимальное значение функции
  333. xmin1 = float.MaxValue;//минимальная точка производной
  334. xmax1 = float.MinValue;//максимальная точка производной
  335. ymin1 = float.MaxValue;//минимальное значение производной функции
  336. ymax1 = float.MinValue;//максимальное значение производной функции
  337.  
  338. Pen pen1 = new Pen(Color.Red);//"кисть" для рисования графика
  339. Pen pen2 = new Pen(Color.Black);//"кисть" для рисования координатнй плоскости
  340. Pen pen3 = new Pen(Color.Blue);//"кисть" для рисования производной графика
  341. Pen pen4 = new Pen(Color.Green);//"кисть" для выделения промежутков
  342.  
  343. int button4_priznak = 0;//состояние кнопки "Подсвечивание промежутков"
  344. int priznak = 0;//признак выделения цветами промежутки F(x) > 0 и F'(x) < 0
  345. double dx = 0.13;//параметр для вычисления производной
  346. string a = "1";//параметр в заданной функции
  347. double delta = 0.13; //частота точек на графике
  348. int state = 0; //состояние программы
  349. int p1 = int.MaxValue;//индекс первой точки первого разрыва в общем массиве
  350. int p2 = int.MaxValue;//индекс второй точки разрыва в общем массиве
  351. int p11 = 0;//индекс последней точки первого разрыва в общем массиве
  352. int p22 = 0;//индекс последней точки второго разрыва в общем массиве
  353. int pr1 = int.MaxValue;//индекс первой точки первого разрыва производной в общем массиве
  354. int pr2 = int.MaxValue;//индекс второй точки второго разрыва производной в общем массиве
  355. int pr11 = 0;//индекс последней точки первого разрыва производной в общем массиве
  356. int pr22 = 0;//индекс последней точки второго разрыва производной в общем массиве
  357. float[] arx1 = new float[2000];//массив подставленный точек производной
  358. float[] ary1 = new float[2000];//массив значений в подставленных точках производной
  359. float[] arx = new float[2000];//массив подставленный точек
  360. float[] ary = new float[2000];//массив значений в подставленных точках
  361.  
  362. gr = pictureBox1.CreateGraphics();
  363. gr.Clear(Color.White); //стерание графика
  364. state++;
  365. button1.Text = "Построить график";
  366. double b = 1;
  367.  
  368. pictureBox1.Height = (int)(this.Height * 0.9);
  369. pictureBox1.Width = (int)(this.Width * 0.9);
  370. float ph = pictureBox1.Height;
  371.  
  372. MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
  373. int m = 0;
  374. MyFunction.PRMass(a, ref arx1, ref ary1, ref xmin1, ref xmax1, ref ymin1, ref ymax1, delta, ref pr1, ref pr2, ref pr11, ref pr22, dx);
  375. pictureBox1.Invalidate();
  376. }
  377.  
  378. private void button3_Click(object sender, EventArgs e)//закрытие окна и завершение компиляции программы
  379. {//выход
  380. this.Close();
  381. }
  382.  
  383. private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)//выбор значения параметра для вычисления функции
  384. {
  385. a = comboBox1.SelectedItem.ToString();
  386. //a = "2,0";
  387.  
  388. double b;
  389. double.TryParse(a, out b);
  390.  
  391. if ((b < -10) || (b > 10))
  392. {
  393. MessageBox.Show(" Введен неверный параметр а, введите еще раз");
  394. comboBox1.Focus();
  395. }
  396. float ph = pictureBox1.Height;
  397. MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
  398. MyFunction.PRMass(a, ref arx1, ref ary1, ref xmin1, ref xmax1, ref ymin1, ref ymax1, delta, ref pr1, ref pr2, ref pr11, ref pr22, dx);
  399. pictureBox1.Invalidate();
  400. }
  401.  
  402. private void trackBar1_ValueChanged(object sender, EventArgs e)//выбор значения dx для производной
  403. {
  404. dx = trackBar1.Value / 100;
  405. float ph = pictureBox1.Height;
  406. MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
  407. MyFunction.PRMass(a, ref arx1, ref ary1, ref xmin1, ref xmax1, ref ymin1, ref ymax1, delta, ref pr1, ref pr2, ref pr11, ref pr22, dx);
  408. pictureBox1.Invalidate();
  409. }
  410.  
  411. private void Form1_SizeChanged(object sender, EventArgs e)//изменение размера холста в зависимости от размера Form
  412. {
  413. pictureBox1.Width = (int)(this.Width * 0.9);
  414. pictureBox1.Height = (int)(this.Height * 0.9);
  415. pictureBox1.Invalidate();
  416. }
  417.  
  418. private void Form1_Load(object sender, EventArgs e)//загрузка формы (самое первое действие)
  419. {
  420. pictureBox1.Height = (int)(this.Height * 0.9);
  421. pictureBox1.Width = (int)(this.Width * 0.9);
  422.  
  423. float ph = pictureBox1.Height;
  424.  
  425. MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
  426.  
  427. MyFunction.PRMass(a, ref arx1, ref ary1, ref xmin1, ref xmax1, ref ymin1, ref ymax1, delta, ref pr1, ref pr2, ref pr11, ref pr22, dx);
  428. }
  429. }
  430. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement