
- •Введение
- •Постановка задачи
- •Разработка технического задания
- •2.1 Анализ вариантов использования программы
- •Потоки событий
- •Основной поток
- •2.2. Альтернативные потоки
- •2.2 Требования к приложениям
- •Анализ алгоритма решения задачи
- •3.1 Метод Монте-Карло
- •3.2 Определение попадания точки внутрь трапеции
- •Настольное приложение wpf
- •4.1 Технология Windows Presentation Foundation
- •4.2 Логическое проектирование приложения
- •4.3 Тестирование приложения
- •5.1 Программные средства для разработки приложения
- •5.2 Логическое проектирование
- •5.2.1 Структура приложения
- •5.2.2 Проектирование приложения.
- •Листинг №1. Определение попадания точки в четырехугольник. HaXe.
- •6. Клиент-Серверное приложение на базе asp.Net
- •6.1 Программные средства разработки приложения
- •6.2 Логическое проектирование Web-сервиса
- •6.3 Логическое проектирование клиентской части
- •6.4 Генерирование прокси-класса
- •6.5 Системные требования
- •Руководство программиста
- •6.7.1 Назначение и условия применения приложения
- •Структура приложения
- •6.8.4 Сообщения оператору
- •6.9 Тестирование приложения
- •Анализ вычислительной эффективности приложений
- •Заключение
- •Приложения
- •9.1 Листинг приложения на базе wpf Файл MainWindow.Xaml
- •Файл MainWindow.Xaml.Cs
- •9.2 Листинг приложения на базе haXe/php Файл Main.Hx
- •Файл Index.Html
- •9.3 Листинг клиент-северного приложения на базе asp.Net Файл Service.Asmx
- •Файл Service.Cs
- •Файл MainWindow.Xaml
- •Файл MainWindow.Xaml.Cs
9.3 Листинг клиент-северного приложения на базе asp.Net Файл Service.Asmx
<%@ WebService Language="C#" CodeBehind="~/App_Code/Service.cs" Class="MyNS.Service" %>
Файл Service.Cs
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Drawing;
using System.Collections; //библиотека для использования типа ArrayList
namespace MyNS
{
[WebService(Namespace = "http://tempuri.org")] //задаем свой наймспейс(можно писать что угоно тут)
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service() //объявление класса Веб-Сервайса
{
}
[WebMethod] //наш вебметод площади
public ArrayList MonteCarloABCE(double Ax, double Ay, double Bx, double By, double Cx, double Ex,double n) //принимаем из клиента координаты и количество точек, и выполяем расчет площади метдом Монте-Карло
{
ArrayList list = new ArrayList(); //создаем объект для возвращения результатов работы в клиент
point A = new point(Ax, Ay); //создание 4 точек
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); //создаем временную точку (используется в методе монте-карло)
ABCE.points = 0; //Обнуляем количество точек чтобы избежать суммирования результатов эксперимента
double S_Monte = ABCE.S_Monte(ABCE, System.Convert.ToInt32(n)); //расчитываем площадь методм монте-Карло(подробнее в описании метода класса)
double S_Teor = ABCE.S_Teor(ABCE); //аналогично, только для теоретической площади
points = System.Convert.ToInt32(ABCE.points); //записываем количество попавших точек
double delta = System.Convert.ToDouble(ABCE.S_Teor(ABCE) - ABCE.S_Monte(ABCE, System.Convert.ToInt32(n))); //расчитываем погрешность
double ttime = Convert.ToDouble(ABCE.time.Milliseconds.ToString()); //Расчитываем время
//упаковка результатов работы для отправки клиенту
list.Add(n);
list.Add(points);
list.Add(S_Monte);
list.Add(Math.Abs(delta) / S_Monte * 100.0);
list.Add(ttime);
list.Add(S_Teor);
list.Add(ABCE.S_O_Rect(ABCE));
//возвращаем клиенту данные
return list;
}
}
public class point : Object //класс точка, наследуется от System.Object
{
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 double getx() //получить значение
{
return this.x;
}
public double gety() //--//
{
return this.y;
}
public point getRand(double x, double y) //создаем случайную точку
{
point RandPoint = new point(x, y);
return RandPoint;
}
public double Check(point one, point two, double x3) //расчет координат с помощью уравнения прямой, для последующего определения принадлежности точки прямоугольнику
{
// point temp1 = one;
//point temp2 = two;
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(); //инициализация генератора случайных чисел
double delta = 0; //погрешность
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; //Засечь время
}
if (C.x < E.x)
{
if (random.x < B.x) //проверка принадлежности по левой границе
{
tempy.y = tempy.Check(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.y = tempy.Check(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)
{
if (random.x < ABCE.B.x) //проверка по левой границе
{
tempy.y = tempy.Check(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)
{
if (random.x < ABCE.B.x) //провека по левой границе
{
tempy.y = tempy.Check(A, B, random.x);
if (random.y <= tempy.y)
{
points += 1;
}
}
if (random.x == ABCE.B.x) //аналогично случаю 1
{
points += 1;
}
if (random.x == ABCE.C.x) //аналогично случаю 1
{
points += 1;
}
if (random.x == ABCE.E.x) //аналогично случаю 1
{
points += 1;
}
if (random.x > ABCE.B.x && random.x < ABCE.C.x) //проверка по правой границе
{
tempy.y = tempy.Check(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) //макс х( так как 3 случая)
{
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;
}
};
}