Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Назначение и условия применения приложения

Поиск

Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло. Приложение состоит из двух частей (клиентской и серверной) и реализовано на языке программирования высокого уровня C#. Серверная часть реализована на чистом C#, в то время, как клиентское приложение использует технологию WPF.

Структура приложения

Данное приложение состоит из двух частей (клиентской и серверной). В клиентской части реализован интерфейс пользователя с помощью технологии WPF. Серверным приложением является Web-служба XML технологии ASP.NET.

Клиентское приложение.

В состав проекта клиентского приложения ASP.NET входят следующие файлы:

MainWindow.xaml – файл, содержащий информацию о контролах и разметке этих контролов на языке xaml;

MainWindow.xaml.cs – Файл, в котором содержится сама логика программы(алгоритм метода Монте-Карло, обработчики событий, и т.д.)

Reference.cs – содержит прокси-класс web-сервиса;

Reference.map – содержит ссылки на файлы с расширениями.disco и.wsdl;

Service.disco – содержит ссылки и адреса на механизмы, используемые для доступа к web-сервису;

Service.wsdl – описание web-сервиса.

В проект настольного приложения включены следующие пространства имен:

System – основное пространство имен, содержит фундаментальные и базовые классы, которые определяют распространенные типы значений и ссылочные типы данных, события и обработчики событий, интерфейсы, атрибуты и исключения обработки. Также содержит классы, обеспечивающие поддержку преобразования типов данных, операций с параметрами методов, математических операций, удаленного и локального вызова программ, управления средой приложений и контроля управляемых и неуправляемых приложений;

System.Drawing – пространство имен обеспечивает доступ к GDI + основным инструментариям графики. Предоставляет методы для рисования с устройством отображения классов, таких как прямоугольник и точка инкапсуляции GDI + примитивов.

System.Collections – пространство имен в котором содержится большое количество встроенных типов, таких как массив, очередь, стек и др. Обладает широкими возможностями для работы со своими встроенными типами, что позволяет наиболее эффективно ими управлять.

Серверное приложение (web-сервис).

Проект web-сервиса содержит следующие файлы:

Service.asmx – точка входа в web-сервис;

Service.cs – содержит основной код (реализацию) web-сервиса;

web.config – содержит настройки web-сервиса.

Руководство пользователя

Назначение приложения

Приложение предназначено для вычисления площади четырехугольника методом Монте-Карло.

Условия выполнения приложения

Для успешной работы программы необходимо иметь компьютер соответствующим системным требованиям (см. пункт «6.5 Системные требования»). Наличие исполняемого модуля P3_WPF.exe, опубликованный и корректно работающий на локальной машине web-сервис на сервере IIS.

Выполнение приложения

Для выполнения приложения необходимо выполнить следующие действия:

· запустить исполняемый модуль программы;

· в появившемся окне MS Windows ввести координаты четырехугольника, по которым будет производиться расчет;

· в появившемся окне программы ввести координаты четырехугольника, либо выбрать вариант «контрольный пример», который автоматически внесет данные, по которым будет производиться расчет;

· нажать на кнопку «Рассчитать» и дождаться результатов работы программы (результат работы программы представлен на рис.);

· выход из программы осуществляется посредством закрытия окна приложения.

Сообщения оператору

Если пользователь в текстовом поле ввода координат введет недопустимый символ, то ему будет показано сообщение-подсказка об ошибке и о причинах ее возникновения. Что бы устранить данную ошибку необходимо просто ввести корректное значение координаты или нажать на кнопку «Очистить», для обнуления введенных данных.

Если пользователь нажал на кнопку «Рассчитать», но при этому ввел значения координат не удовлетворяющие описанию заданного четырехугольника, то на экране компьютера будет отображено предупреждение с пояснением причины возникновения ошибки. Для того что бы устранить данную ошибку необходимо вновь корректно задать координаты или нажать на одну из кнопок «контрольных примеров».

Тестирование приложения

Результаты тестирования представлены на рис. 15

 

 

Анализ вычислительной эффективности приложений

Исследование вычислительной сложности алгоритма производится путем определения зависимости времени вычисления площади четырехугольника от количества генерируемых точек для метода Монте-Карло. В результате выполнения данной курсовой работы были разработаны три приложения (настольное приложение, приложения на базе скриптов haxe/PHP и на базе ASP.NET), которые выполняют одну и ту же задачу (вычисление площади четырехугольника методом Монте-Карло).

Тестирование проводилось на следующей машине:

· операционная система Windows 7 Ultimate x64

· частота процессора 2.5 ГГц (процессор Intel core i5)

· объем оперативной памяти 4096 MB

Для сравнения вычислительной эффективности этих приложений были использованы одинаковые входные данные (координаты вершин четырехугольника, площадь которого находилась, и количество генерируемых точек для метода Монте-Карло). В каждом приложении выдавалось время вычислений в каждом опыте. Результаты представлены в таблице.

Таблица. Сравнение вычислительной эффективности приложений

Количество точек Время выполнения приложения, мс
Настольное приложение Приложение на базе скриптов Приложение на базе ASP.NET
       
       
       
       
       

Из таблицы видно, что web-приложение на базе ASP.NET и настольное приложение имеют приблизительно одинаковый результат по времени. Но если учитывать то, что web-приложение посылает поочередно на сервер 5 запросов и поочередно запускаются 5 web-сервисов, и то время, которое тратится web-сервисом на сериализацию и десириализацию SOAP-сообщений, можно утверждать что web-сервис работает быстрее. Самым медленным по времени выполнения является web-приложение на базе haxe/PHP. Это связано с тем, что при выполнении данного приложения оно не компилируется, а интерпретируется, т.к. написано на скриптовом языке. Это означает, что исходный текст не компилируется а интерпретируется, обрабатывая исходный код построчно. Такой алгоритм и объясняет низкую скорость обработки.


Заключение

В ходе работы было разработано настольное приложение, приложение на базе технологии ASP и приложение на базе технологии ASP.NET, решающие одну и ту же задачу приближенного вычисления площади четырехугольника методом Монте-Карло. По полученным результатам была исследована вычислительная эффективность различных технологий программирования.

В результате выполнении данной курсовой работы были закреплены знания по курсу "Технологии программирования" и приобретены навыки клиент-серверной реализации прикладной задачи (задачи вычисления площади геометрической фигуры методом Монте-Карло) в виде Web приложения с использованием Web сервера IIS и Web сервисов XML, технологий ASP, ASP.NET, WPF, языков C#, haxe, PHP, HTML, а также различных инструментальных систем и библиотек, автоматизирующих проектирование и программирование создаваемого приложения.

 

 

Приложения

Листинг приложения на базе WPF

Файл MainWindow.xaml

 

<Window

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

x:Class="П1_ТП.Window1"

x:Name="Window"

Title="П1.WPF: Метод Монте-Карло ABCE"

Height="600" Width="600"

MinWidth="600" MinHeight="600" SnapsToDevicePixels="False" MaxWidth="600" MaxHeight="600" Loaded="Window_Loaded">

<Grid Height="509">

<Grid.ColumnDefinitions>

<ColumnDefinition Width="472*" />

<ColumnDefinition Width="106*" />

</Grid.ColumnDefinitions>

<GroupBox Header="Контрольные примеры" Height="54" Name="groupBox1" VerticalAlignment="Bottom" Margin="0,0,0,-10" FontStyle="Normal" FontWeight="Normal" Grid.ColumnSpan="2">

<WrapPanel Height="26" Name="wrapPanel2" Width="523">

<Button Height="23" Name="button1" Width="104" Click="button1_Click" Content="№1(C&gt;E)"></Button>

<Button Height="23" Name="button2" Width="104" Click="button2_Click" Content="№2(C=E)"></Button>

<Button Height="23" Name="button3" Width="104" Click="button3_Click" Content="№3(C&gt;E)"></Button>

<Button Height="23" Name="button4" Width="104" Click="button4_Click" Content="rand №4(C&lt;E)"></Button>

<Button Height="23" Name="button5" Width="104" Click="button5_Click" Content="rand №5(C&gt;E)"></Button>

</WrapPanel>

</GroupBox>

<GroupBox Header="Таблица результатов" Margin="0,229,0,43" Name="groupBox2" Grid.ColumnSpan="2">

<WrapPanel Height="186" Name="wrapPanel1" Width="521">

<TextBox Height="50.347" Name="textBox1" Width="104" IsReadOnly="True" MinLines="1" MaxLines="2" TextWrapping="WrapWithOverflow" CharacterCasing="Normal" AutoWordSelection="False" AcceptsTab="False" AcceptsReturn="False" TextDecorations="None" TextAlignment="Center">Количество точек</TextBox>

<TextBox Height="50.339" Name="textBox2" Width="104" IsReadOnly="True" TextAlignment="Center" TextWrapping="WrapWithOverflow">Количество попавших точек</TextBox>

<TextBox Height="50.339" Name="textBox3" Width="104" IsReadOnly="True" TextAlignment="Center" TextWrapping="WrapWithOverflow">Рассчитанная площадь</TextBox>

<TextBox Height="50.344" Name="textBox4" Width="104" IsReadOnly="True" TextAlignment="Center" TextWrapping="WrapWithOverflow">Погрешность, %</TextBox>

<TextBox Height="50.334" Name="textBox5" Width="104" IsReadOnly="True" TextAlignment="Center" TextWrapping="WrapWithOverflow">Время, ms</TextBox>

<TextBox Height="23" Name="textBox6" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox7" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox8" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox9" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox10" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox11" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox12" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox13" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox14" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox15" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox16" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox17" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox18" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox19" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox20" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox21" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox22" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox23" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox24" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox25" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox26" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox27" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox28" Width="104" IsReadOnly="True" />

<TextBox Height="23" Name="textBox29" Width="104" IsReadOnly="True" />

<TextBox Height="23" IsReadOnly="True" Name="textBox36" Width="104" />

<TextBox Height="23" IsReadOnly="True" Name="textBox37" Width="159" Text="Площадь прямоугольника:"></TextBox>

<TextBox Height="23" IsReadOnly="True" Name="textBox38" Width="104" />

<TextBox Height="23" IsReadOnly="True" Name="textBox39" Width="153" TextChanged="textBox39_TextChanged" Text="Математическая площадь"></TextBox>

<TextBox Height="23" IsReadOnly="True" Name="textBox40" Width="105" />

</WrapPanel>

</GroupBox>

<GroupBox Header="Рисунок" Height="211" Margin="0,0,174,0" Name="groupBox3" VerticalAlignment="Top">

<Image Height="169" Name="image1" Stretch="Fill" Width="257" HorizontalAlignment="Center" OpacityMask="Black" />

</GroupBox>

<GroupBox Header="Входные параметры" Height="230" Name="groupBox4" VerticalAlignment="Top" VerticalContentAlignment="Top" HorizontalAlignment="Right" Width="274" Margin="0,12,0,0" Grid.ColumnSpan="2"></GroupBox>

<Label Height="29" HorizontalAlignment="Right" Margin="0,199,126,0" Name="label4" VerticalAlignment="Top" Width="22">N:</Label>

<TextBox Height="25" HorizontalAlignment="Right" Margin="0,26,48,0" Name="textBox30" VerticalAlignment="Top" Width="93.5" TextChanged="textBox30_TextChanged">0</TextBox>

<TextBox Height="25" HorizontalAlignment="Right" Margin="0,22,10,0" Name="textBox31" VerticalAlignment="Top" Width="104.5" Grid.ColumnSpan="2">0</TextBox>

<TextBox Height="25" HorizontalAlignment="Right" Margin="0,56,48,0" Name="textBox32" VerticalAlignment="Top" Width="93.5" Text="0"></TextBox>

<TextBox Height="25" HorizontalAlignment="Right" Margin="0,54,10,0" Name="textBox33" VerticalAlignment="Top" Width="104.5" Grid.ColumnSpan="2">0</TextBox>

<TextBox Height="25" HorizontalAlignment="Left" Margin="330,86,0,0" Name="textBox34" VerticalAlignment="Top" Width="93.5" Text="0"></TextBox>

<TextBox Height="25" HorizontalAlignment="Right" Margin="0,86,12,0" Name="textBox35" VerticalAlignment="Top" Width="102.5" Text="0" Grid.ColumnSpan="2"></TextBox>

<ComboBox Height="22.48" HorizontalAlignment="Right" Margin="0,201,13,0" Name="comboBox1" VerticalAlignment="Top" Width="205" Text="auto" SelectedValuePath="auto" SelectedIndex="0" Grid.ColumnSpan="2">

<ComboBoxItem Name="auto">auto</ComboBoxItem>

<ComboBoxItem Name="одна">1000</ComboBoxItem>

<ComboBoxItem ForceCursor="False" Name="десять">10000</ComboBoxItem>

<ComboBoxItem Name="сто">100000</ComboBoxItem>

<ComboBoxItem Name="тыща">1000000</ComboBoxItem>

<ComboBoxItem Name="десятьтыща">10000000</ComboBoxItem>

</ComboBox>

<Label Height="25" Name="label1" Width="22" HorizontalAlignment="Right" Margin="0,84,15,0" VerticalAlignment="Top" Content="Ex:"></Label>

<Button Height="25" Name="button6" Width="102.5" Click="button6_Click" Margin="441,170,34,314" Grid.ColumnSpan="2">Очистить</Button>

<Button Height="25" Name="button7" Width="102.5" Click="button7_Click" IsCancel="False" Padding="1" HorizontalContentAlignment="Center" FlowDirection="LeftToRight" AllowDrop="True" BorderThickness="1" ClipToBounds="False" IsTabStop="True" Margin="331,170,38,314">Рассчитать</Button>

<Label Content="Bx:" Height="25" HorizontalAlignment="Right" Margin="0,55,142,0" Name="label3" VerticalAlignment="Top" Width="22" />

<Label Height="25" Name="label2" Content="Ax:" Margin="308,24,142,460"></Label>

<Label Content="Ay:" Height="25" Margin="436,26,14,458" Name="label5" />

<Label Content="By:" Height="25" Margin="436,56,14,428" Name="label6" />

<Label Content="Cx:" Height="25" Margin="308,86,142,398" Name="label7" />

</Grid>

</Window>

 

 

Файл 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;

}

};

}

}

 

Листинг приложения на базе haXe/PHP

Файл Main.hx

package;

import haxe.Timer;

import php.Lib;

import php.Web;

 

 

class Main

{

 

static function main()

{

Lib.print("

<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8' /><title>П2. Haxe/PHP ABCE</title><style type='text/css'>

<!--

p { margin: 4px; }

form { margin: 0px;}

body {background-color: #FFFFFF;}

table { background-color: #F2F2F2; text-align: center;}

-->

</style></head><body><table width='640' border='1' align='center'cellspacing='0' cellpadding='0'><tr><td bgcolor='#C7C7C7'>П2. Haxe/PHP ABCE</td></tr><tr><td>

");

 

var params:Hash<Dynamic> = Web.getParams();

var Ax:Float = params.get("ax");

var Ay:Float = params.get("ay");

var Bx:Float = params.get("bx");

var By:Float = params.get("by");

var Cx:Float = params.get("cx");

var Cy:Float = By;

var Dx:Float = params.get("dx");

var Dy:Float = params.get("dy");

var Ex:Float = params.get("ex");

var Ey:Float = Ay;

var r_Cx:Float =Ex-Ax;

var u_By:Float = By-Ay;

var tests:Array<Bool> = [

((params.get("test1") == "on")?true:false),

((params.get("test2") == "on")?true:false),

((params.get("test3") == "on")?true:false),

((params.get("test4") == "on")?true:false),

((params.get("test5") == "on")?true:false)

];

 

var square_Rect = r_Cx * u_By;

var square = Math.round(Math_Square(Ax, Ay,Bx, By, Cx, Ex) * 1000) / 1000;

var soloma = Ax + Bx;

Lib.print("<table border='1' width='100%'>");

Lib.print("<tr><td>N</td><td>Математическая площадь</td> <td>Площадь (Монте-Карло)<td>Погрешность, %</td><td>Время, мс</td></td></tr>");

for (i in 0...tests.length)

if(tests[i])

{

var n:Int = cast 1000 * Math.pow(10, i);

Lib.print("<tr bgcolor='#ffffff'>");

Lib.print("<td>" + n + "</td>");

Lib.print("<td>" + square + "</td>");

var start_time = Timer.stamp();

var square_monte_carlo = MonteKarlo_Square(n, Ax,Ay,Bx, By, Cx,Ex);

var delta_time = Timer.stamp() - start_time;

Lib.print("<td>" + square_monte_carlo + "</td>");

Lib.print("<td>" + Math.round((Math.abs(square / square_monte_carlo - 1) * 100)*1000)/1000 + "</td>");

Lib.print("<td>" + Math.round(delta_time*1000) + "</td>");

Lib.print("</tr>");

}

Lib.print("</table>");

 

Lib.print("

<form id='form1' name='form1' action='index.html'>To return, click <input type='submit' value='Назад' /></form></td></tr></table></body></html>

");

}

 

 

static function Math_Square(x1:Float, y1:Float, x2:Float, y2:Float, x3:Float, x4:Float)

{

 

return Math.abs(((x4-x1) + (x3 - x2)) / 2) * (y2-y1);

 

 

}

 

 

static function getCurve(x1:Float,y1:Float,x2:Float,y2:Float,x3:Float)

{

var k:Float = (y2-y1)/(x2-x1);

var b:Float = y1-k*x1;

var y:Float = k*x3+b;

return y;

}

 

static function MonteKarlo_Square(n:Int, x1:Float, y1:Float, x2:Float, y2:Float, x3:Float,x4:Float)

{

 

//Count of hits

var points = 0;

 

 

var xMax = Math.max(Math.max(x1, x2),Math.max(x3,x4));

var xMin = Math.min(Math.min(x1, x2),Math.min(x3,x4));

var yMax = Math.max(y1, y2);

var yMin = Math.min(y1, y2);

var y3 = y2;

var y4 = y1;

var r_Cx:Float =xMax-xMin;

var u_By:Float = yMax-yMin;

var square_Rect = r_Cx * u_By;

var newy:Float = 0;

var randx:Float = 0; //init random variables

var randy:Float = 0;

var test = 0;

for (i in 0...n)

{

randx = Math.random() * (xMax - xMin) + xMin;

randy = Math.random() * (yMax - yMin) + yMin;

 

if(x3<x4) //esli c<e(slychai 1)

{

if(randx<x2)

{

newy = getCurve(x1,y1,x2,y2,randx);

if(randy<=newy)

{

points+=1;

}

}

if(randx==x2)

{

points+=1;

}

if(randx==x3)

{

points+=1;

}

if(randx>x2&&randx<x3)

{

points+=1;

 

}

if(randx>x3)

{

newy= getCurve(x3,y3,x4,y4,randx);

if(randy>=newy)

{

points+=1;

}

}

}

if(x3==x4) //esli c==e(slychai 2)

{

if(randx<x2)

{

newy = getCurve(x1,y1,x2,y2,randx);

if(randy<=newy)

{

points+=1;

}

}

 

if(randx>=x2&&randx<=x3)

{

points+=1;

}

}

if(x3>x4) //esli c>e(slychai 3)

{

if(randx<x2)

{

newy = getCurve(x1,y1,x2,y2,randx);

if(randy<=newy)

{

points+=1;

}

}

if(randx==x2)

{

points+=1;

}

if(randx==x3)

{

points+=1;

}

if(randx==x4)

{

points+=1;

}

if(randx>x2&&randx<x4)

{

points+=1;

}

if(randx>x4&&randx<x3)

{

newy = getCurve(x3,y3,x4,y4,randx);

if(randy>=newy)

{

points+=1;

 

}

}

}

}

 

return points*square_Rect/n;

 

}

}

 

 

Файл Index.html

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>П2. Haxe/PHP ABCE </title>

<style type="text/css">

<!--

p {

margin: 4px;

}

body {

background-color: #FFFFFF;

}

table {

background-color: #F2F2F2;

text-align: center;

}

-->

</style>

</head>

 

<body>

<table width="100%" height="100%" border="1" align="center"cellspacing="0" cellpadding="0">

 

<tr>

<td bgcolor="#D3D8E9" align="center">П2. Haxe/PHP ABCE</td>

</tr>

<tr>

 

<td><table width="640" border="0" align="left" cellpadding="0" cellspacing="4">

 

<tr>

<td width="200" align="left" valign="top"><form id="form1" name="form1" method="post" action="./index.php">

<table width="100%" height="150" border="0" cellspacing="0" cellpadding="0">

 

<tr>

<td>Ax:

<input name="ax" id="ax" type="text" value="0" size="7" maxlength="7"/></td>

<td>Ay:

<input name="ay" id="ay" type="text" value="0" size="7" maxlength="7"/></td>

 

</tr>

<tr>

<td>Bx:

<input name="bx" id="bx" type="text" value="0" size="7" maxlength="7"/></td>

<td>By:

<input name="by" id="by" type="text" value="0" size="7" maxlength="7"/></td>

</tr>

<tr>

<td>Cx:

<input name="cx" id="cx" type="text" value="0" size="7" maxlength="7"/></td>

</tr>

<tr>

<td>Ex:

<input name="ex" id="ex" type="text" value="0" size="7" maxlength="7"/></td>

</tr>

</table>

 

<select name="select" size="1" align="center" id="select" style="width:100%">

<option>Ручной ввод</option>

<option onclick="document.getElementById('ax').value='15';document.getElementById('ay').value='10';document.getElementById('bx').value='30';document.getElementById('by').value='30';document.getElementById('cx').value='40';document.getElementById('ex').value='50';">Прямоугольник Ex>Cx</option>

<option onclick="document.getElementById('ax').value='3';document.getElementById('ay').value='14';document.getElementById('bx').value='7';document.getElementById('by').value='25';document.getElementById('cx').value='20';document.getElementById('ex').value='16';">Прямоугольник Ex"<"Cx</option>

<option onclick="document.getElementById('ax').value='15';document.getElementById('ay').value='10';document.getElementById('bx').value='30';document.getElementById('by').value='30';document.getElementById('cx').value='50';document.getElementById('ex').value='50';">Прямоугольник Ex=Cx</option>

<option onclick="document.getElementById('ax').value='3';document.getElementById('ay').value='14';document.getElementById('bx').value='7';document.getElementById('by').value='25';document.getElementById('cx').value='20';document.getElementById('ex').value='16';">Прямоугольник Ex"<"Cx</option>

<option onclick="document.getElementById('ax').value='15';document.getElementById('ay').value='10';document.getElementById('bx').value='30';document.getElementById('by').value='30';document.getElementById('cx').value='50';document.getElementById('ex').value='50';">Прямоугольник Ex=Cx</option>

</select>

 

 

<input id="run" type="submit" style="width:100%" value="Расчитать" />

<input id="clear" type="button" style="width:100%" value="Очистить" onClick="document.getElementById('ax').value='0';document.getElementById('ay').value='0';document.getElementById('bx').value='0';document.getElementById('by').value='0';document.getElementById('cx').value='0';document.getElementById('ex').value='0';"/>

<p align="center">N:</p>

<p>

<label>

<input name="test1" type="checkbox" checked="checked"/>

&#8470;1 (1000)</label>

</p>

<p>

<label>

<input name="test2" type="checkbox" checked="checked"/>

&#8470;2 (10000)</label>

</p>

<p>

<label>

<input name="test3" type="checkbox" checked="checked"/>

&#8470;3 (100000)</label>

</p>

<p>

<label>

<input name="test4" type="checkbox" checked="checked"/>

&#8470;4 (1000000)</label>

</p>

<p>

<label>

<input name="test5" type="checkbox" checked="checked"/>

&#8470;5 (10000000)</label>

</p>

</form></td>

<td align="right">

<table width="10%" border="7" cellspacing="0" cellpadding="0" align="right" >

<tr>

<td width="427" height="260" bgcolor="#CCCFFF" >

<div style="width:427px; height:260px" id="Canvas"><img src="image2.gif" width="351" height="242" alt="name" /></div>

 

</td>

</tr>

</table></td>

</tr>



Поделиться:


Последнее изменение этой страницы: 2016-09-20; просмотров: 482; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.117.94.172 (0.014 с.)