Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ_ТП_Алексеев_v7.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
745.61 Кб
Скачать

Файл MainWindow.Xaml.Cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.Threading;

namespace П3_ТП

{

/// <summary>

/// Логика взаимодействия для Window1.xaml

/// </summary>

public partial class Window1 : Window

{

BitmapImage bitmap1, bitmap2, bitmap3, bitmap4, bitmap5;

int n = 0;

public Window1()

{

InitializeComponent();

Uri uri = new Uri(@"C:\images\image2_old.gif");

BitmapImage bitmap = new BitmapImage(uri);

image1.Source = bitmap;

Uri uri1 = new Uri(@"C:\images\image1.gif");

Uri uri2 = new Uri(@"C:\images\image2.gif");

Uri uri3 = new Uri(@"C:\images\image3.gif");

Uri uri4 = new Uri(@"C:\images\image4.gif");

Uri uri5 = new Uri(@"C:\images\image5.gif");

bitmap1 = new BitmapImage(uri1);

bitmap2 = new BitmapImage(uri2);

bitmap3 = new BitmapImage(uri3);

bitmap4 = new BitmapImage(uri4);

bitmap5 = new BitmapImage(uri5);

}

public double Ax;

public double Ay;

public double Bx;

public double By;

public double Cx;

public double Ex;

private void button7_Click(object sender, RoutedEventArgs e)

{

try

{

Ax = System.Convert.ToDouble(textBox30.Text);

Ay = System.Convert.ToDouble(textBox31.Text);

Bx = System.Convert.ToDouble(textBox32.Text);

By = System.Convert.ToDouble(textBox33.Text);

Cx = System.Convert.ToDouble(textBox34.Text);

Ex = System.Convert.ToDouble(textBox35.Text);

}

catch

{

MessageBox.Show("Ошибка", "Error", MessageBoxButton.OK, MessageBoxImage.Error);

return;

}

if (Ax > Bx || Bx > Cx || Ax > Ex || Ax > Cx || Ay > By)

{

MessageBox.Show("Проверьте правильность введенных данных", "Error", MessageBoxButton.OK, MessageBoxImage.Error);

return;

}

if (Ax == 0 && Bx == 0 && Cx == 0 && Ex == 0 && Ay == 0 && By == 0)

{

MessageBox.Show("Проверьте правильность введенных данных", "Error", MessageBoxButton.OK, MessageBoxImage.Error);

return;

}

//обработчик события расчитать

//запись чисел из формы в переменные

Ax = System.Convert.ToDouble(textBox30.Text);

Ay = System.Convert.ToDouble(textBox31.Text);

Bx = System.Convert.ToDouble(textBox32.Text);

By = System.Convert.ToDouble(textBox33.Text);

Cx = System.Convert.ToDouble(textBox34.Text);

Ex = System.Convert.ToDouble(textBox35.Text);

double n = 1000; //количество точек

//создание объектов класса "Точка"

point A = new point(Ax, Ay);

point B = new point(Bx, By);

point C = new point(Cx, By);

point E = new point(Ex, Ay);

// int points = 0; //по идее не нужно

Rect ABCE; //инициализация объекта класса прямоугольник

ABCE = new Rect(A, B, C, E); //присвоение координатам вершин координаты соответствующих точек

point tempy = new point(0, 0); //точка для проверки принадлежности по формуле y=kx+b

textBox37.Text = System.Convert.ToString(ABCE.S_Teor(ABCE)); //выводит теоретическую площадь

textBox38.Text = System.Convert.ToString(ABCE.S_O_Rect(ABCE)); //выводит площадь описанного четырехугольника

textBox6.Text = System.Convert.ToString(n); //Запись коичества точек

double test4 = ABCE.S_O_Rect(ABCE); //расчет погрешности

ABCE.points = 0;

textBox8.Text = System.Convert.ToString(ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))); //запись количества точек

textBox7.Text = System.Convert.ToString(ABCE.points); //ВЫВОд количества точек, попавших в прямоугольник

double test = ABCE.S_Teor(ABCE); //временные переменные

double test2 = System.Convert.ToDouble(ABCE.S_Teor(ABCE) - ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))); //аналогично

//расчет погрешности

test2 = test2 / ((ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))) * 100.0); //погрешность

test2 = Math.Abs(test2);

test2 = Math.Abs(ABCE.S_Teor(ABCE) - ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))) / ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)) * 100.0; //вывод погрешности в %

textBox9.Text = System.Convert.ToString(test2); //вывод

double ttime = Convert.ToDouble(ABCE.time.Milliseconds.ToString()); //перевод времени в миллсикунды

textBox10.Text = System.Convert.ToString(ttime); //записываешь время в таблицу

n = 10000;//n=10000

ABCE.points = 0; //обнуление данных предыдущего эксперимента

textBox11.Text = System.Convert.ToString(n); //аналогично см. выше

textBox13.Text = System.Convert.ToString(ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)));

textBox12.Text = System.Convert.ToString(ABCE.points);

textBox14.Text = System.Convert.ToString(Math.Abs(((ABCE.S_Teor(ABCE) - ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))) / ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)) * 100.0)));

ttime = Convert.ToDouble(ABCE.time.Milliseconds.ToString());

textBox15.Text = System.Convert.ToString(ttime);

n = 100000; //n = 100000

ABCE.points = 0; //аналогично см. выше

textBox16.Text = System.Convert.ToString(n);

textBox18.Text = System.Convert.ToString(ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)));

textBox17.Text = System.Convert.ToString(ABCE.points);

textBox19.Text = System.Convert.ToString(Math.Abs(((ABCE.S_Teor(ABCE) - ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))) / ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)) * 100.0)));

ttime = Convert.ToDouble(ABCE.time.Milliseconds.ToString());

textBox20.Text = System.Convert.ToString(ttime);

n = 1000000; //n = 1000000

ABCE.points = 0; //Аналогично см.выше

textBox21.Text = System.Convert.ToString(n);

textBox23.Text = System.Convert.ToString(ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)));

textBox22.Text = System.Convert.ToString(ABCE.points);

textBox24.Text = System.Convert.ToString(Math.Abs(((ABCE.S_Teor(ABCE) - ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))) / ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)) * 100.0)));

ttime = Convert.ToDouble(ABCE.time.Milliseconds.ToString());

textBox25.Text = System.Convert.ToString(ttime);

n = 10000000;

ABCE.points = 0;

textBox26.Text = System.Convert.ToString(n);

textBox28.Text = System.Convert.ToString(ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)));

textBox27.Text = System.Convert.ToString(ABCE.points);

textBox29.Text = System.Convert.ToString(Math.Abs(((ABCE.S_Teor(ABCE) - ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))) / ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)) * 100.0)));

ttime = Convert.ToDouble(ABCE.time.Milliseconds.ToString());

textBox36.Text = System.Convert.ToString(ttime);

}

//slychai 1

private void button1_Click(object sender, RoutedEventArgs e)

{

Ax = 15; Ay = 10;

Bx = 30; By = 30;

Cx = 40; Ex = 50;

image1.Source = bitmap1;

//-------

textBox30.Text = Convert.ToString(Ax); textBox31.Text = Convert.ToString(Ay);

textBox32.Text = Convert.ToString(Bx); textBox33.Text = Convert.ToString(By);

textBox34.Text = Convert.ToString(Cx); textBox35.Text = Convert.ToString(Ex);

}

// slychai 2

private void button2_Click(object sender, RoutedEventArgs e)

{

Ax = 15; Ay = 10;

Bx = 30; By = 30;

Cx = 50; Ex = 50;

image1.Source = bitmap2;

//-------

textBox30.Text = Convert.ToString(Ax); textBox31.Text = Convert.ToString(Ay);

textBox32.Text = Convert.ToString(Bx); textBox33.Text = Convert.ToString(By);

textBox34.Text = Convert.ToString(Cx); textBox35.Text = Convert.ToString(Ex);

}

// slychai 3

private void button3_Click(object sender, RoutedEventArgs e)

{

Ax = 3; Ay = 14;

Bx = 7; By = 25;

Cx = 20; Ex = 16;

image1.Source = bitmap3;

//-------

textBox30.Text = Convert.ToString(Ax); textBox31.Text = Convert.ToString(Ay);

textBox32.Text = Convert.ToString(Bx); textBox33.Text = Convert.ToString(By);

textBox34.Text = Convert.ToString(Cx); textBox35.Text = Convert.ToString(Ex);

}

// rand slychai 1

private void button4_Click(object sender, RoutedEventArgs e)

{

Random input = new Random();

for (int i = 0; i < 1000000; i++)

{

Ax = Convert.ToInt32(input.NextDouble() * 1000);

Ay = Convert.ToInt32(input.NextDouble() * 1000);

Bx = Convert.ToInt32(input.NextDouble() * 1000);

By = Convert.ToInt32(input.NextDouble() * 1000);

Cx = Convert.ToInt32(input.NextDouble() * 1000);

Ex = Convert.ToInt32(input.NextDouble() * 1000);

if (Cx < Ex && Ax < Bx && Ay < By && Bx < Cx && Ax < Ex && Ax < Cx)

{

break;

}

}

// RandX = (test.NextDouble() * (MaxX - MinX) + MinX);

image1.Source = bitmap4;

//-------

textBox30.Text = Convert.ToString(Ax); textBox31.Text = Convert.ToString(Ay);

textBox32.Text = Convert.ToString(Bx); textBox33.Text = Convert.ToString(By);

textBox34.Text = Convert.ToString(Cx); textBox35.Text = Convert.ToString(Ex);

}

// rand slychai 3

private void button5_Click(object sender, RoutedEventArgs e)

{

Random input = new Random();

for (int i = 0; i < 1000000; i++)

{

Ax = Convert.ToInt32(input.NextDouble() * 1000);

Ay = Convert.ToInt32(input.NextDouble() * 1000);

Bx = Convert.ToInt32(input.NextDouble() * 1000);

By = Convert.ToInt32(input.NextDouble() * 1000);

Cx = Convert.ToInt32(input.NextDouble() * 1000);

Ex = Convert.ToInt32(input.NextDouble() * 1000);

if (Cx > Ex && Ax < Bx && Ay < By && Bx < Cx && Ax < Ex && Ax < Cx)

{

break;

}

}

image1.Source = bitmap5;

//-------

textBox30.Text = Convert.ToString(Ax); textBox31.Text = Convert.ToString(Ay);

textBox32.Text = Convert.ToString(Bx); textBox33.Text = Convert.ToString(By);

textBox34.Text = Convert.ToString(Cx); textBox35.Text = Convert.ToString(Ex);

}

//обработчик события "Очистить"

private void button6_Click(object sender, RoutedEventArgs e)

{

textBox6.Text = ""; textBox7.Text = ""; textBox8.Text = ""; textBox9.Text = "";

textBox10.Text = ""; textBox11.Text = ""; textBox12.Text = ""; textBox13.Text = "";

textBox14.Text = ""; textBox15.Text = ""; textBox16.Text = ""; textBox17.Text = "";

textBox18.Text = ""; textBox19.Text = ""; textBox20.Text = ""; textBox21.Text = "";

textBox22.Text = ""; textBox23.Text = ""; textBox24.Text = ""; textBox25.Text = "";

textBox26.Text = ""; textBox27.Text = ""; textBox28.Text = ""; textBox29.Text = "";

textBox36.Text = "";

textBox30.Text = "";

textBox31.Text = "";

textBox32.Text = "";

textBox33.Text = "";

textBox34.Text = "";

textBox35.Text = "";

textBox38.Text = ""; textBox40.Text = "";

}

private void Window_Loaded(object sender, RoutedEventArgs e)

{

}

private void textBox39_TextChanged(object sender, TextChangedEventArgs e)

{

}

private void textBox30_TextChanged(object sender, TextChangedEventArgs e)

{

}

public class point

{ //Координаты x,y

public double x, y;

//конструктор по умолчанию

public point()

{

x = 0; y = 0;

}

//конструктор инициализации

public point(double a, double b)

{

x = a; y = b;

}

//конструктор копии

public point(point a)

{

x = a.x; y = a.y;

}

//получение значений приватных полей

//генерация координат случайной точки

public point getRand(double x, double y)

{

point RandPoint = new point(x, y);

return RandPoint;

}

//расчет уравнения прямой по формуле y=kx+b для последующей проверки попадания точки в трапецию

public double getCurve(point one, point two, double x3)

{

//принимает 2 точки, и координату х случайной точки.

double k = (two.y - one.y) / (two.x - one.x);

double b = one.y - k * one.x;

double y = k * x3 + b;

return y;

}

};

//Класс четырехугольник

public class Rect : point

{

//данные по умолчани.

public point A = new point(0, 0);

public point B = new point(0, 0);

public point C = new point(0, 0);

public point E = new point(0, 0);

public TimeSpan time; //время эксперимента

public double points; //количество попавших точек

//конструктор по умолчанию

public Rect()

{

A.x = 0;

A.y = 0;

B.x = 0;

B.y = 0;

C.x = 0;

C.y = 0;

E.x = 0;

E.y = 0;

}

// конструктор инициализации

public Rect(point iA, point iB, point iC, point iE)

{

//this.x = iA.x;

A.x = iA.x;

A.y = iA.y;

B.x = iB.x;

B.y = iB.y;

C.x = iC.x;

C.y = iC.y;

E.x = iE.x;

E.y = iE.y;

}

//конструктор копии

public Rect(Rect a)

{

A = a.A;

B = a.B;

C = a.C;

E = a.E;

}

public double S_Monte(Rect ABCE, int n) //Алгоритм монте-карло

{

ABCE.points = 0; //обнуление прерыдущего эксперимента

Random rand = new Random(); //инициализация генератора случайных чисел

point tempy = new point(0, 0); // временная точка дя проверки принадлежности

point random = new point(0, 0); //случайная точка

DateTime stop, start; //для засечения времени

TimeSpan time; //время в миллисикундах

start = System.DateTime.Now; //начинаем отсчет

for (int i = 0; i < n; i++) //Monte_Karlo v rabote

{

//генерирование случайных координат для точки

random = random.getRand((rand.NextDouble() * (ABCE.GetWidth(ABCE)) + ABCE.GetMinX(ABCE)), (rand.NextDouble() * (ABCE.GetHeigth(ABCE)) + ABCE.GetMinY(ABCE)));

if (i == 0)

{//засечение времени

start = System.DateTime.Now;

}//zasekaem vremya

if (C.x < E.x) //случай 1. Сx<Ex

{

if (random.x < B.x) //проверка попадания по левой гранце

{

tempy.y = tempy.getCurve(A, B, random.x); //присвоение значения случайной точки

if (random.y <= tempy.y) //проверка попадания по левой границе

{

ABCE.points += 1; //если выполняется, увеличиваем количество попавших точек

}

}

if (random.x == B.x) //еСЛИ точка попала в точку Б

{

ABCE.points += 1;

}

if (random.x == C.x) //если точка между точками Б и С

{

ABCE.points += 1;

}

if (random.x > B.x && random.x < C.x) //если точка в центре

{

ABCE.points += 1;

}

if (random.x > C.x) //проверка попадания по правой границе

{

// tempy = getCurve(Cx, Cy, Ex, Ey, RandX);

tempy.y = tempy.getCurve(C, E, random.x);

if (random.y >= tempy.y)

{

ABCE.points += 1;

}

}

}

//if(Cx==Ex) //esli c==e(slychai 2)

if (ABCE.C.x == ABCE.E.x) //если Cx = Ex

{

if (random.x < ABCE.B.x) //проверка попадания по правой границе

{

tempy.y = tempy.getCurve(A, B, random.x);

if (random.y <= tempy.y)

{

points += 1;

}

}

if (random.x >= ABCE.B.x && random.x <= ABCE.C.x) //если попала правее правой границы

{

points += 1;

}

}

//if(Cx>Ex) //esli c>e(slychai 3)

if (ABCE.C.x > ABCE.E.x) //Cx>Ex

{

if (random.x < ABCE.B.x) //проверка правой границы

{

tempy.y = tempy.getCurve(A, B, random.x); //----//

if (random.y <= tempy.y)

{

points += 1;

}

}

if (random.x == ABCE.B.x) //--//

{

points += 1;

}

if (random.x == ABCE.C.x) //если попала в точку С

{

points += 1;

}

if (random.x == ABCE.E.x) //если попала в точку Е

{

points += 1;

}

if (random.x > ABCE.B.x && random.x < ABCE.C.x) //проверка правой границы

{

tempy.y = tempy.getCurve(C, E, random.x); //--//

if (random.y >= tempy.y) //--//

{

points += 1;

}

}

}

}

stop = System.DateTime.Now; //останавливаем таймер

ABCE.time = stop - start; //расчитываем затраченное время

return ABCE.points / n * ABCE.S_O_Rect(ABCE); //возвращаем площадь монтекарло

}

public double S_Teor(Rect ABCE) //Расчт теоретической площади

{

double S_Teor = (ABCE.B.y - ABCE.A.y) * (((ABCE.E.x - ABCE.A.x) + (ABCE.C.x - ABCE.B.x)) / 2);

return S_Teor;

}

public double GetWidth(Rect ABCE) //получение ширины описанного четырехугольника

{

double MaxX = Math.Max(Math.Max(ABCE.A.x, ABCE.B.x), Math.Max(ABCE.C.x, ABCE.E.x));

double MinX = Math.Min(Math.Min(ABCE.A.x, ABCE.B.x), Math.Min(ABCE.C.x, ABCE.E.x));

return MaxX - MinX;

}

public double GetHeigth(Rect ABCE) // получение высоты описанного четырехугольника

{

double MaxY = Math.Max(Math.Max(ABCE.A.y, ABCE.B.y), Math.Max(ABCE.C.y, ABCE.E.y));

double MinY = Math.Min(Math.Min(ABCE.A.y, ABCE.B.y), Math.Min(ABCE.C.y, ABCE.E.y));

return MaxY - MinY;

}

public double GetMinX(Rect ABCE) //нахождение минимального х

{

double MinX = Math.Min(Math.Min(ABCE.A.x, ABCE.B.x), Math.Min(ABCE.C.x, ABCE.E.x));

return MinX;

}

public double GetMinY(Rect ABCE) //нахождение минимального у

{

double MinY = Math.Min(Math.Min(ABCE.A.y, ABCE.B.y), Math.Min(ABCE.C.y, ABCE.E.y));

return MinY;

}

public double S_O_Rect(Rect ABCE) //нахождение площади описанногго четырехугольника

{

double S_O_Rect = (ABCE.GetWidth(ABCE)) * (ABCE.GetHeigth(ABCE));

return S_O_Rect;

}

};

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]