
- •Введение
- •Постановка задачи
- •1.1 Разработка технического задания
- •1.1 Анализ вариантов использования программы
- •Потоки событий
- •Основной поток
- •2.2. Альтернативные потоки
- •1.2 Требования к приложениям
- •1.3 Входные данные
- •1.4 Выходные данные
- •Анализ алгоритма решения задачи
- •Настольное приложение wpf
- •3.1 Технология Windows Presentation Foundation
- •3.2 Логическое проектирование приложения
- •4. Web приложение на базе скриптов haXe/php
- •Листинг №1. Определение попадания точки в четырехугольник. HaXe.
- •4.3 Результат работы приложения Рисунк 10. Результат эксперимента haXe/php
- •5. Web приложение на базе asp.Net
- •5.1 Программные средства разработки приложения
- •5.2 Логическое проектирование Web-сервиса
- •5.3 Логическое проектирование клиентской части
- •5.3 Генерирование прокси-класса
- •5.4 Вызов web-сервиса в асинхронном режиме
- •5.5 Системные требования
- •5.7Руководство программиста
- •5.7.1 Назначение и условия применения приложения
- •5.7.2Структура приложения
- •5.8.4 Сообщения оператору
- •5.9 Результат работы приложения
- •Анализ вычислительной эффективности приложений
- •Заключение
- •Список литературы
- •Приложение Файл MainWindow.Xaml(настольное приложение)
- •Файл MainWindow.Xaml.Cs
- •Файл Main.Hx(web приложение на базе скриптов)
- •Файл Index.Html
- •Файл Service.Asmx(web сервис)
- •Файл Service.Cs
- •Файл MainWindow.Xaml(клиентская часть приложения wpf)
- •Файл MainWindow.Xaml.Cs
Файл 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;
}
};
}
}