Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- namespace WindowsFormsApplication2
- {
- public partial class Form1 : Form
- {
- float xmin = float.MaxValue,//минимальная точка
- xmax = float.MinValue,//максимальная точка
- ymin = float.MaxValue,//минимальное значение функции
- ymax = float.MinValue,//максимальное значение функции
- xmin1 = float.MaxValue,//минимальная точка производной
- xmax1 = float.MinValue,//максимальная точка производной
- ymin1 = float.MaxValue,//минимальное значение производной функции
- ymax1 = float.MinValue;//максимальное значение производной функции
- Pen pen1 = new Pen(Color.Red);//"кисть" для рисования графика
- Pen pen2 = new Pen(Color.Black);//"кисть" для рисования координатнй плоскости
- Pen pen3 = new Pen(Color.Blue);//"кисть" для рисования производной графика
- Pen pen4 = new Pen(Color.Green);//"кисть" для выделения промежутков
- int button4_priznak = 0;//состояние кнопки "Подсвечивание промежутков"
- int priznak = 0;//признак выделения цветами промежутки F(x) > 0 и F'(x) < 0
- double dx = 0.13;//параметр для вычисления производной
- string a = "1";//параметр в заданной функции
- double b = 2;
- double delta = 0.01; //частота точек на графике
- int state = 0; //состояние программы
- int p1 = int.MaxValue;//индекс первой точки первого разрыва в общем массиве
- int p2 = int.MaxValue;//индекс второй точки разрыва в общем массиве
- int p11 = 0;//индекс последней точки первого разрыва в общем массиве
- int p22 = 0;//индекс последней точки второго разрыва в общем массиве
- int pr1 = int.MaxValue;//индекс первой точки первого разрыва производной в общем массиве
- int pr2 = int.MaxValue;//индекс второй точки второго разрыва производной в общем массиве
- int pr11 = 0;//индекс последней точки первого разрыва производной в общем массиве
- int pr22 = 0;//индекс последней точки второго разрыва производной в общем массиве
- float[] arx1 = new float[2000];//массив подставленный точек производной
- float[] ary1 = new float[2000];//массив значений в подставленных точках производной
- float[] arx = new float[2000];//массив подставленный точек
- float[] ary = new float[2000];//массив значений в подставленных точках
- bool[] t = new bool[2000];
- Graphics gr; // Контекст изображения ("холст")
- public Form1()
- {
- InitializeComponent();
- string[] d = new string[201]; //начало заполнения комбобокса параметрами
- int j = 0;
- for (double i = -10; i < 10; i += 0.1, j++)
- {
- d[j] = i.ToString("f1");
- }
- comboBox1.Items.AddRange(d); //конец заполнения комбобокса параметрами
- }//Form1
- private void pictureBox1_Paint(object sender, PaintEventArgs e)//рисование на picterbox1
- {
- gr = e.Graphics;
- if (state % 2 == 0) return;
- int xMax, yMax;
- xMax = pictureBox1.Width;//ширина холста
- yMax = pictureBox1.Height;//высота холста
- gr.Clear(Color.White); // стереть график
- //Pen pen2 = MyFunction.Color_Choice();//выбор цвета
- float q1 = 0, s1 = pictureBox1.Height / 2, q2 = pictureBox1.Width, s2 = pictureBox1.Height / 2;
- gr.DrawLine(pen2, q1, s1, q2, s2);
- float z1 = pictureBox1.Width / 2, v1 = 0, z2 = pictureBox1.Width / 2, v2 = pictureBox1.Height;
- gr.DrawLine(pen2, z1, v1, z2, v2);
- //масштабирование
- float beta = xMax / (xmax - xmin);//единичный отрезок по Х
- float gama = yMax / (ymax - ymin) * 75;//единичный отрезок по У
- //Pen pen1 = MyFunction.Color_Choice();//выбор цвета
- for (int k = 0; k < 1999;)
- {
- if (t[k + 1] == false | t[k] == false)
- k++;
- else
- {
- float x1 = arx[k],
- x2 = arx[k + 1],
- y1 = ary[k],
- y2 = ary[k + 1];
- x1 = (-xmin + x1) * beta;
- x2 = (-xmin + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama;
- gr.DrawLine(Pens.Red, x1, y1, x2, y2);
- k++;
- }
- }
- /*
- for (int k = 0; k < n - 1;)
- {
- if (fd[k + 1] == false | fd[k] == false)
- k++;
- else
- {
- float x1 = xd[k], x2 = xd[k + 1], y1 = yd[k], y2 = yd[k + 1];
- x1 = (x1 - xmind) * xdscale;
- y1 = h / 2 - y1 * ydscale;
- x2 = (x2 - xmind) * xdscale;
- y2 = h / 2 - y2 * ydscale;
- gr.DrawLine(Pens.Blue, x1, y1, x2, y2);
- k++;
- }
- }*/
- /*
- for (int k = 0; k < p1; k++) //рисуем график заданной функции до первой точки разрыва
- {
- float x1 = arx[k],
- x2 = arx[k + 1],
- y1 = ary[k],
- y2 = ary[k + 1];
- //смещение точек для специфической координатной плоскости picterbox1
- x1 = (-xmin + x1) * beta;
- x2 = (-xmin + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama;
- gr.DrawLine(pen1, x1, y1, x2, y2);//прорисовка точек с соответсвующими координатами
- } // end for
- for (int k = p1 + 1; k < p2; k++) //рисуем график заданной функции после первой точки разрыва до второй
- {
- float x1 = arx[k],
- x2 = arx[k + 1],
- y1 = ary[k],
- y2 = ary[k + 1];
- //смещение точек для специфической координатной плоскости picterbox1
- x1 = (-xmin + x1) * beta;
- x2 = (-xmin + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama;
- gr.DrawLine(pen1, x1, y1, x2, y2);
- } // end for
- for (int k = p2 + 1; k < arx.Length - 2; k++) //рисуем график заданной функции после последней точки разрыва
- {
- float x1 = arx[k],
- x2 = arx[k + 1],
- y1 = ary[k],
- y2 = ary[k + 1];
- //смещение точек для специфической координатной плоскости picterbox1
- x1 = (-xmin + x1) * beta;
- x2 = (-xmin + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama;
- gr.DrawLine(pen1, x1, y1, x2, y2);
- // end for
- }//end if
- // float beta1 = xMax / (xmax1 - xmin1);//единичный отрезок по Х
- // float gama1 = yMax / (ymax1 - ymin1);//единичный отрезок по У
- //Pen pen3 = MyFunction.Color_Choice();
- /*
- for (int k = 0; k < pr1 - 2; k++) //рисуем график производной заданной функции до первой точки разрыва
- {
- float x1 = arx1[k],
- x2 = arx1[k + 1],
- y1 = ary1[k],
- y2 = ary1[k + 1];
- //смещение точек для специфической координатной плоскости picterbox1
- x1 = (-xmin1 + x1) * beta;
- x2 = (-xmin1 + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama; //(ymax - y2) * gama;
- gr.DrawLine(pen3, x1, y1, x2, y2);
- } // end for
- for (int k = pr1; k < pr2 - 2; k++) //рисуем график производной заданной функции после первой точки разрыва до второй
- {
- float x1 = arx1[k],
- x2 = arx1[k + 1],
- y1 = ary1[k],
- y2 = ary1[k + 1];
- //смещение точек для специфической координатной плоскости picterbox1
- x1 = (-xmin1 + x1) * beta;
- x2 = (-xmin1 + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama;
- gr.DrawLine(pen3, x1, y1, x2, y2);
- }// end for
- for (int k = pr2 + 1; k < arx1.Length - 2; k++) //рисуем график производной заданной функции после последней точки разрыва
- {
- float x1 = arx1[k],
- x2 = arx1[k + 1],
- y1 = ary1[k],
- y2 = ary1[k + 1];
- //смещение точек для специфической координатной плоскости picterbox1
- x1 = (-xmin1 + x1) * beta;
- x2 = (-xmin1 + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama; //(ymax - y2) * gama;
- gr.DrawLine(pen3, x1, y1, x2, y2);
- }// end for
- //Pen pen4 = MyFunction.Color_Choice();
- if (priznak % 2 != 0)
- {
- for (int k = 0; k < ary.Length - 1; k++)
- {
- if ((k == p1) & (k == p2)) continue;
- if ((ary[k] > 0) & (ary[k + 1] > 0))
- {
- float x1 = arx[k],
- x2 = arx[k + 1],
- y1 = ary[k],
- y2 = ary[k + 1];
- x1 = (-xmin + x1) * beta;
- x2 = (-xmin + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama;
- gr.DrawLine(pen4, x1, y1, x2, y2);
- }//end if
- if ((k == pr1) & (k == pr2)) continue;
- if ((ary1[k] < 0) & (ary1[k + 1] < 0))
- {
- float x1 = arx1[k],
- x2 = arx1[k + 1],
- y1 = ary1[k],
- y2 = ary1[k + 1];
- x1 = (-xmin1 + x1) * beta;
- x2 = (-xmin1 + x2) * beta;
- y1 = pictureBox1.Height / 2 - y1 * gama;
- y2 = pictureBox1.Height / 2 - y2 * gama;
- gr.DrawLine(pen4, x1, y1, x2, y2);
- }
- }//end for
- } //end if priznak*/
- }//end picturebox1.Paint
- private void button4_Click(object sender, EventArgs e)//выделение цветом установленных областей
- {
- /*MessageBox.Show(" Выберите цвет для выделения областей ");
- Pen pen4 = MyFunction.Color_Choice();//выбор цвета для выделения областей
- */
- priznak++;
- button4_priznak++;//переключение состояния данной кнопки
- if (priznak % 2 == 0)
- {
- button4.Text = "Подсветить промежутки";
- gr = pictureBox1.CreateGraphics();
- pictureBox1.Invalidate();//убрать подсвечивание промежутков
- return;
- }
- button4.Text = "Стереть график";
- pictureBox1.Invalidate();
- }
- private void button1_Click(object sender, EventArgs e)//прорисовка графика и его удаление
- {
- /*MessageBox.Show(" Выберите цвет для прорисовки координатной плоскости ");
- Pen pen2 = MyFunction.Color_Choice();//выбор цвета для координатной плоскости
- MessageBox.Show(" Выберите цвет для прорисовки графика ");
- Pen pen1 = MyFunction.Color_Choice();//выбор цвета для графика
- MessageBox.Show(" Выберите цвет для прорисовки производной графика ");
- Pen pen3 = MyFunction.Color_Choice();//выбор цвета для производной графика
- */
- state++;
- if (state % 2 == 0)
- {
- button1.Text = "Построить график";
- gr = pictureBox1.CreateGraphics();
- gr.Clear(Color.AntiqueWhite); //стерание графика
- if (button4_priznak % 2 == 1)//проверка: была ли нажата кнопка "Подсветка"
- {
- button4_priznak++;
- priznak++;
- }
- return;
- }
- button1.Text = "Стереть график";
- button4.Text = "Подсветить промежутки";
- pictureBox1.Invalidate();
- }
- private void button2_Click(object sender, EventArgs e)//установление дефолтных параметров
- {
- xmin = float.MaxValue;//минимальная точка
- xmax = float.MinValue;//максимальная точка
- ymin = float.MaxValue;//минимальное значение функции
- ymax = float.MinValue;//максимальное значение функции
- xmin1 = float.MaxValue;//минимальная точка производной
- xmax1 = float.MinValue;//максимальная точка производной
- ymin1 = float.MaxValue;//минимальное значение производной функции
- ymax1 = float.MinValue;//максимальное значение производной функции
- Pen pen1 = new Pen(Color.Red);//"кисть" для рисования графика
- Pen pen2 = new Pen(Color.Black);//"кисть" для рисования координатнй плоскости
- Pen pen3 = new Pen(Color.Blue);//"кисть" для рисования производной графика
- Pen pen4 = new Pen(Color.Green);//"кисть" для выделения промежутков
- int button4_priznak = 0;//состояние кнопки "Подсвечивание промежутков"
- int priznak = 0;//признак выделения цветами промежутки F(x) > 0 и F'(x) < 0
- double dx = 0.13;//параметр для вычисления производной
- string a = "1";//параметр в заданной функции
- double delta = 0.13; //частота точек на графике
- int state = 0; //состояние программы
- int p1 = int.MaxValue;//индекс первой точки первого разрыва в общем массиве
- int p2 = int.MaxValue;//индекс второй точки разрыва в общем массиве
- int p11 = 0;//индекс последней точки первого разрыва в общем массиве
- int p22 = 0;//индекс последней точки второго разрыва в общем массиве
- int pr1 = int.MaxValue;//индекс первой точки первого разрыва производной в общем массиве
- int pr2 = int.MaxValue;//индекс второй точки второго разрыва производной в общем массиве
- int pr11 = 0;//индекс последней точки первого разрыва производной в общем массиве
- int pr22 = 0;//индекс последней точки второго разрыва производной в общем массиве
- float[] arx1 = new float[2000];//массив подставленный точек производной
- float[] ary1 = new float[2000];//массив значений в подставленных точках производной
- float[] arx = new float[2000];//массив подставленный точек
- float[] ary = new float[2000];//массив значений в подставленных точках
- gr = pictureBox1.CreateGraphics();
- gr.Clear(Color.White); //стерание графика
- state++;
- button1.Text = "Построить график";
- double b = 1;
- pictureBox1.Height = (int)(this.Height * 0.9);
- pictureBox1.Width = (int)(this.Width * 0.9);
- float ph = pictureBox1.Height;
- MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
- int m = 0;
- 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);
- pictureBox1.Invalidate();
- }
- private void button3_Click(object sender, EventArgs e)//закрытие окна и завершение компиляции программы
- {//выход
- this.Close();
- }
- private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)//выбор значения параметра для вычисления функции
- {
- a = comboBox1.SelectedItem.ToString();
- //a = "2,0";
- double b;
- double.TryParse(a, out b);
- if ((b < -10) || (b > 10))
- {
- MessageBox.Show(" Введен неверный параметр а, введите еще раз");
- comboBox1.Focus();
- }
- float ph = pictureBox1.Height;
- MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
- 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);
- pictureBox1.Invalidate();
- }
- private void trackBar1_ValueChanged(object sender, EventArgs e)//выбор значения dx для производной
- {
- dx = trackBar1.Value / 100;
- float ph = pictureBox1.Height;
- MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
- 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);
- pictureBox1.Invalidate();
- }
- private void Form1_SizeChanged(object sender, EventArgs e)//изменение размера холста в зависимости от размера Form
- {
- pictureBox1.Width = (int)(this.Width * 0.9);
- pictureBox1.Height = (int)(this.Height * 0.9);
- pictureBox1.Invalidate();
- }
- private void Form1_Load(object sender, EventArgs e)//загрузка формы (самое первое действие)
- {
- pictureBox1.Height = (int)(this.Height * 0.9);
- pictureBox1.Width = (int)(this.Width * 0.9);
- float ph = pictureBox1.Height;
- MyFunction.Mass(a, ref arx, ref ary, ref t, ref xmin, ref xmax, ref ymin, ref ymax, delta);
- 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);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement