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

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;

}

};

}

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