Количество
точек
|
Время
выполнения приложения, мс
|
|
Настольное
приложение WPF
|
Веб-приложение
на базе ASP/JScript
|
Веб-приложение
на базе WebForm/ASMX/C#
|
1000
|
0
|
22
|
10
|
10000
|
3
|
450
|
17
|
100000
|
27
|
2719
|
40
|
1000000
|
277
|
24441
|
309
|
10000000
|
3019
|
245248
|
3150
|
Из таблицы видно, что приложение на базе
WebForm/ASMX/C# оказалось самым производительным. Также самым медленным по
времени выполнения является веб-приложение на базе ASP/JScript. Объясняется это
тем, что JScript - скриптовый язык, и его сценарии не транслируются ни в
машинный, ни в байт-код, а каждый раз интерпретируются сервером.
Исследования проводились на ЭВМ со следующими
характеристиками:
процессор
- Intel® Core™ i5-3210M CPU @2.50GHz 2.50GHz;
оперативная память - 4096 Мб;
операционная система - Windows 7 SP1;
видеокарта
- NVIDIA GeForce 610M 2048Mb.
Заключение
В ходе работы были разработаны три приложения:
настольное приложение WPF/C#, веб-приложение на базе ASP/JScript, приложение на
базе WebForm/ASMX/C#, решающие одну и ту же задачу приближенного вычисления
площади фигуры методом Монте-Карло. Также приложения подсчитываю время выполнения
вычислений и их относительную погрешность. По полученным результатам была
исследована вычислительная эффективность различных технологий программирования.
Также были закреплены знания, полученные в ходе
изучения курса "Технологии программирования".
Список литературы
ГОСТ
19.106-78 ЕСПД. Требования к программным документам, выполненным печатным
способом.
ГОСТ
19.401-78 ЕСПД. Текст программы. Требования к содержанию и оформлению.
ГОСТ
19.402-78 ЕСПД. Описание программы.
ГОСТ
19.404-79 ЕСПД. Пояснительная записка. Требования к содержанию и оформлению.
ГОСТ
2.10 -95 «Общие требования к текстовым документам».
ГОСТ
19.701 - 90 ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные
обозначения и правила выполнения.
ГОСТ
19.503-79 Руководство системного программиста. Требования к содержанию и
оформлению.
ГОСТ
19.504-79 Руководство программиста. Требования к содержанию и оформлению.
ГОСТ
19.505-79 Руководство пользователя. Требования к содержанию и оформлению.
Компьютерное
оформление отчетных документов / Составитель Т.И. Матикашвили, ТулГУ, Тула,
2000. -36 с.
Библиотека
Microsoft MSDN - URL: <http://msdn.microsoft.com/ru-ru/library>
Шилдт
Г. - C# 4.0 полное руководство - Москва: Вильямс, 2011. - 1056 с.
Натан,
А. WPF 4. Подробное руководство. - СПб. : Символ-Плюс, 2011. - 880 с.
Ч.
Петцольд
Microsoft Windows Presentation Foundation - М. : Русская Редакция;
СПб.
: Питер,
2008. - 944 с.
Приложение
Файл IceCream.cs(Настольного приложения на базе
WPF/C#)
using
System;System.Collections.Generic;System.Linq;System.Drawing;System.Text;WPF_MonteKarlo
{IceCream
{abe;ab;abcd;k1;k2;(PointF a, PointF
b, PointF e)
{= new Triangle(a, b, e);= new
Circle(a, b);= new Rectangle(ab.minX, abe.maxX, abe.minY, abe.maxY);
}bool PointInIceCream(PointF randP)
{(randP.X>(ab.centrPoint.X))
{ return abe.PointInLines(randP);}
{ return ab.PointInCircle(randP); }
}float realSquare() { return
(abe.Square() + ab.Square());}float minX
{
{ab.minX;
}
}float maxX
{
{abe.maxX;
}
}float minY
{
{abe.minY;
}
}float maxY
{
{abe.maxY;
}
}float MonteKarloSquare(int count,
out int numberPoints, out float rel_delta)
{rand = new Random();= 0;
//DateTime start_date_time =
DateTime.Now;(int k = 0; k < count; k++)
{p = new PointF(minX +
(float)(rand.NextDouble() * (maxX - minX)),+ (float)(rand.NextDouble() * (maxY
- minY)));(PointInIceCream(p))
{++;
}
}
//DateTime end_date_time =
DateTime.Now;MK_Square = abcd.Square() * ((float)numberPoints /
(float)count);_delta = (float)Math.Round((Math.Abs((MK_Square - realSquare()) *
100) / realSquare()) * 10000) / (float)10000.0;MK_Square;
}
}Triangle
{a, b, e;k1;k2;(PointF a1, PointF
b1, PointF e1)
{ = a1; b = b1; e = e1;= (e.Y - a.Y)
/ (e.X - a.X);= (e.Y - b.Y) / (e.X - b.X);
}float Square()
{ab = (float)Math.Sqrt(Math.Pow((a.X
- b.X), 2) + Math.Pow((a.Y - b.Y), 2));ae = (float)Math.Sqrt(Math.Pow((a.X -
e.X), 2) + Math.Pow((a.Y - e.Y), 2));be = (float)Math.Sqrt(Math.Pow((b.X -
e.X), 2) + Math.Pow((b.Y - e.Y), 2));polperim = (ab + ae + be) /
2.0f;(float)Math.Sqrt((polperim * (polperim - ab) * (polperim - ae) * (polperim
- be)));
}bool PointInLines(PointF p)
{((((p.X - a.X) * k1 + a.Y) >=
p.Y) || (((p.X - b.X) * k2 + b.Y) <= p.Y))
{true;
}
{false;
}
}float maxX
{
{e.X;
}
}float minY
{
{a.Y;
}
}float maxY
{
{b.Y;
}
}
}Circle
{centr;r;(PointF a, PointF b)
{= (b.Y - a.Y) / 2;= new PointF(a.X,
a.Y + r);
}float Square()
{(float)(Math.PI * Math.Pow(r, 2) /
2.0);
}bool PointInCircle(PointF p1)
{(p1.X < centr.X)
{((Math.Pow(p1.X - centr.X, 2) +
Math.Pow(p1.Y - centr.Y, 2)) <= Math.Pow(r, 2));
}{ return false; }
}float minX
{centr.X - r;
}
}PointF centrPoint
{
{centr;
}
}
}Rectangle
{minX, maxX, minY, maxY;(float MiX,
float MaX, float MiY, float MaY)
{= MiX;= MaX;= MiY;= MaY;
}float Square()
{(maxX - minX) * (maxY - minY);
}
}
}
Файл
MainWindow.xaml
<Window
x:Class="WPF_MonteKarlo.MainWindow"="http://schemas.microsoft.com/winfx/2006/xaml/presentation":x="http://schemas.microsoft.com/winfx/2006/xaml"="Расчет
площади
методом
Монте-Карло"
Height="416.289" Width="654.78"
ShowInTaskbar="False" Background="#FF8D8D8D"
WindowStyle="ThreeDBorderWindow" Loaded="Window_Loaded"
ResizeMode="NoResize"
Icon="Graphicloads-Food-Drink-Icecream-2.ico">
<Grid
Margin="0,0,0,-3">
<RichTextBox
x:Name="RichResultTB" Margin="10,223,10,18"
Background="White" BorderBrush="Red" RenderTransformOrigin="0.665,0.689">
<FlowDocument>
<Paragraph/>
</FlowDocument>
</RichTextBox>
<Canvas Height="218"
VerticalAlignment="Top" Background="#FF8D8D8D"
RenderTransformOrigin="0.5,0.5">
<Image x:Name="Image1"
Height="179" Canvas.Left="337" Width="305"
Canvas.Top="29" Source="Image/Мороженкаv2.bmp"
/>
<Button
x:Name="Button1" Content="Рассчитать"
HorizontalAlignment="Left" VerticalAlignment="Top"
Width="75" Click="Button1_Click" Canvas.Left="20"
Canvas.Top="168" Height="40"/>
<GroupBox Header="Координаты
точек"
HorizontalAlignment="Center" VerticalAlignment="Top"
Height="134" Width="309" Margin="0"
Panel.ZIndex="2" BorderBrush="#FFFF0004"
Foreground="Black" OpacityMask="#FF200CEE"
Canvas.Left="10" Canvas.Top="29">
<WrapPanel
Margin="0,0,-2,0">
<WrapPanel Height="26"
Width="290">
<Label Content=""
Width="78"/>
<Label Content="Координата
Х"
Width="115"/>
<Label Content="Координата
Y" Width="94"/>
</WrapPanel>
<Label Content="Точка
А:"/>
<TextBox
x:Name="KoordinX_A" Height="23"
TextWrapping="Wrap" Text="-7" Width="120"
LostFocus="LostFocusTB"/>
<TextBox
x:Name="KoordinY_A" Height="23"
TextWrapping="Wrap" Text="-9" Width="120"
LostFocus="LostFocusTB"/>
<Label Content="Точка
В:"
Width="56"/>
<TextBox
x:Name="KoordinX_B" Height="23"
TextWrapping="Wrap" Text="-7" Width="120"
LostFocus="LostFocusTB"/>
<TextBox
x:Name="KoordinY_B" Height="23"
TextWrapping="Wrap" Text="17" Width="120"
LostFocus="LostFocusTB"/>
<Label Content="Точка
Е:"
Width="56"/>
<TextBox
x:Name="KoordinX_E" Height="23"
TextWrapping="Wrap" Text="37" Width="120"
LostFocus="LostFocusTB"/>
<TextBox
x:Name="KoordinY_E" Height="23"
TextWrapping="Wrap" Text="9" Width="120"
LostFocus="LostFocusTB"/>
</WrapPanel>
</GroupBox>
<Button x:Name="Button2"
Content="Очистить"
Canvas.Left="100" Canvas.Top="168" Width="75"
Height="40" Click="Button2_Click"/>
<Button
x:Name="Button3" Content="Контрольный
пример"
Canvas.Left="180" Canvas.Top="168" Width="139"
Height="40" Click="Button3_Click"/>
<Label Content="Курсовая работа по
исследованию вычислительной эффективности веб-технологий. Выполнил:
ст.
гр.
622121 Сальников
В.В.
" Height="29" FontFamily="Tahoma"
FontSize="11" Width="652" Foreground="Black"/>
</Canvas>
<Label Content=""
HorizontalAlignment="Left" Margin="0,317,0,0"
VerticalAlignment="Top" Height="18" FontSize="7"
Width="54"/>
</Grid>
</Window>
Файл
MainWindow.xaml.csSystem;System.Collections.Generic;System.Linq;System.Text;System.Drawing;System.Windows;System.Windows.Controls;System.Windows.Data;System.Windows.Documents;System.Windows.Input;System.Windows.Media;System.Windows.Media.Imaging;System.Windows.Navigation;System.Windows.Shapes;System.Threading;WPF_MonteKarlo
{
/// <summary>
/// Логика
взаимодействия
для
MainWindow.xaml
/// </summary>partial class
MainWindow : Window
{MainWindow()
{();
}PointF a = new PointF(-7,
-9);PointF b = new PointF(-7, 17);PointF e = new PointF(37, 9);
//float ax = -7;
// float bx = -7;
//float ex = 37;
// float ay = -9;
//float by = 17;
//float ey = 9;calc_thread =
null;bool check()
{result = true; // ошибок
нетNumber;Error
= "";(float.TryParse(KoordinY_A.Text, out Number)) // проверка
координаты
Y точки
А
{(float.Parse(KoordinY_A.Text) >=
float.Parse(KoordinY_B.Text))
{+= "Координата Y точки A не может быть
больше координаты Y точки В ";
KoordinY_A.Text = a.Y.ToString();=
false;
}(float.Parse(KoordinY_A.Text) >=
float.Parse(KoordinY_E.Text))
{+= "Координата Y точки A не может быть
больше координаты Y точки E";
KoordinY_A.Text = a.Y.ToString();=
false;
}
}
{= false;
}(float.TryParse(KoordinY_B.Text,out
Number)) // проверка координаты
Y точки
B
{(float.Parse(KoordinY_B.Text) <=
float.Parse(KoordinY_A.Text))
{+= "Координата Y точки B не может быть
меньше координаты Y точки А";
KoordinY_B.Text = b.Y.ToString();=
false;
}(float.Parse(KoordinY_B.Text) <=
float.Parse(KoordinY_E.Text))
{+= "Координата Y точки B не может быть
меньше координаты Y точки E";
KoordinY_B.Text = b.Y.ToString();=
false;
}
}
{= false;
}(float.TryParse(KoordinX_A.Text,
out Number)) //проверка
координаты
Х
точки
А
{(float.Parse(KoordinX_A.Text) >=
float.Parse(KoordinX_E.Text))
{+= "Координата X точки A не может быть
больше координаты X точки E";
KoordinX_A.Text = a.X.ToString();=
false;
}
}
{= false;
}(float.TryParse(KoordinX_B.Text,
out Number)) //проверка
координаты
Х
точки
B
{(float.Parse(KoordinX_B.Text) >=
float.Parse(KoordinX_E.Text))
{+= "Координата X точки B не может быть
больше координаты X точки E";
KoordinX_B.Text = b.X.ToString();=
false;
}
}
{= false;
}(float.TryParse(KoordinX_E.Text,
out Number)) //проверка
координаты
Х
точки
Е
{((float.Parse(KoordinX_E.Text)
<= float.Parse(KoordinX_A.Text)) || (float.Parse(KoordinX_E.Text) <=
float.Parse(KoordinX_B.Text)))
{+= "Координата X точки E не может быть
меньше координаты X точки А и В";
KoordinX_E.Text = e.X.ToString();=
false;
}
}
{= false;
}(float.TryParse(KoordinY_E.Text,
out Number)) // проверка
координаты
Y точки
Е
{((float.Parse(KoordinY_E.Text)
<= float.Parse(KoordinY_A.Text)))
{+= "Координата Y точки E не может быть
меньше координаты Y точки А";
KoordinY_E.Text = e.Y.ToString();=
false;
}((float.Parse(KoordinY_E.Text)
>= float.Parse(KoordinY_B.Text)))
{+= "Координата Y точки E не может быть
больше координаты Y точки В";
KoordinY_E.Text = e.Y.ToString();=
false;
}
}
{= false;
}(result == false)
{.Show(Error, "Введено
некорректное
значение
координат",
MessageBoxButton.OK, MessageBoxImage.Warning);result;
}
{result;
}
}void LostFocusTB(object sender,
RoutedEventArgs ee)
{EventTextBox =
(TextBox)sender;Number = 0.0f;TextInTextBox =
EventTextBox.Text.Replace(".",
",");(float.TryParse(TextInTextBox, out Number))
{(EventTextBox.Equals(KoordinX_A))
// проверка
координаты
X точки
А
{_B.Text = KoordinX_A.Text;.X =
float.Parse(KoordinX_B.Text);
}(EventTextBox.Equals(KoordinX_B))
// проверка
координаты
X точки
B
{_A.Text = KoordinX_B.Text;.X =
float.Parse(KoordinX_A.Text);
}(EventTextBox.Equals(KoordinX_E))
// проверка
координаты
X точки
Е
{.X = float.Parse(KoordinX_E.Text);
}(EventTextBox.Equals(KoordinY_A))
// проверка
координаты
Y точки
A
{.Y = float.Parse(KoordinY_A.Text);
}(EventTextBox.Equals(KoordinY_B))
// проверка
координаты
Y точки
B
{.Y = float.Parse(KoordinY_B.Text);
}(EventTextBox.Equals(KoordinY_E))
// проверка
координаты
Y точки
E
{.Y = float.Parse(KoordinY_E.Text);
}(KoordinX_A.Text!=""
&& KoordinX_B.Text!="" &&
KoordinX_E.Text!="" && KoordinY_A.Text != ""
&&
KoordinY_B.Text!="" && KoordinY_E.Text != "")
{.IsEnabled = true;
}
{.IsEnabled = false;
}
}
{cur_result = MessageBox.Show("Введено
некорректное
значение
координаты\n"
,
//"Будет поставлено предыдущее
значение",
"Введено некорректное значение
координаты", MessageBoxButton.OK,
MessageBoxImage.Exclamation);(cur_result
== MessageBoxResult.OK)
{(EventTextBox.Equals(KoordinX_A))
{_A.Text = a.X.ToString();
}(EventTextBox.Equals(KoordinX_B))
{_B.Text = b.X.ToString();
}(EventTextBox.Equals(KoordinX_E))
{_E.Text = e.X.ToString();
}(EventTextBox.Equals(KoordinY_A))
{_A.Text = a.Y.ToString();
}(EventTextBox.Equals(KoordinY_B))
{_B.Text = b.Y.ToString();
}(EventTextBox.Equals(KoordinY_E))
{_E.Text = e.Y.ToString();
}
//KoordinX_A.Text = ax.ToString();
//.X.ToString("R");
//KoordinX_B.Text =
bx.ToString();//.X.ToString("R");
//KoordinX_E.Text = ex.ToString();
//.X.ToString("R");
//KoordinY_A.Text =
ay.ToString();//.X.ToString("R");
//KoordinY_B.Text = by.ToString();
//.X.ToString("R");
//KoordinY_E.Text =
ey.ToString();//.X.ToString("R");
}
}
}void CalcMKSquareThead(IceCream
icecream)
{_thread = new Thread(new
ParameterizedThreadStart(delegate(object thr_obj)
{
{this_form = (MainWindow)thr_obj;t =
null; TableRowGroup trg = null;tr = null; TableCell tcell = null;j =
3;_form.Dispatcher.BeginInvoke(new Action(delegate()
{.Document.Blocks.Clear();= new
Table();= new TableRowGroup();= new TableRow();= new
TableCell();.Blocks.Add(new Paragraph(new Run("Число
точек")));.Cells.Add(tcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Число
попавших
точек
точек")));.Cells.Add(tcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Площадь
Монте-Карло")));.Cells.Add(tcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Точная
площадь")));.Cells.Add(tcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Относительная
погрешность,%")));.Cells.Add(tcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Время
вычисления,мс")));.Cells.Add(tcell);.Rows.Add(tr);.RowGroups.Add(trg);.Document.Blocks.Add(t);
}), null);square =
icecream.realSquare();(int i = 3; i < 8; i++)
{numberPoints = 0;rel_delta =
0;MK_Square = 0; start_date_time = DateTime.Now;_Square =
icecream.MonteKarloSquare((int)Math.Pow(10, i), out numberPoints, out
rel_delta);end_date_time = DateTime.Now;arv_time = end_date_time -
start_date_time;_form.Dispatcher.BeginInvoke(new Action(delegate()
{= new TableRow();= new
TableCell();.Blocks.Add(new Paragraph(new Run(Math.Pow(10,
j).ToString())));.Cells.Add(tcell);= new TableCell();.Blocks.Add(new
Paragraph(new Run(numberPoints.ToString())));.Cells.Add(tcell);= new
TableCell();.Blocks.Add(new Paragraph(new
Run(MK_Square.ToString())));.Cells.Add(tcell);= new TableCell();.Blocks.Add(new
Paragraph(new Run(square.ToString())));.Cells.Add(tcell);= new
TableCell();.Blocks.Add(new Paragraph(new
Run(rel_delta.ToString())));.Cells.Add(tcell);= new TableCell();.Blocks.Add(new
Paragraph(Run((((int)arv_time.TotalMilliseconds).ToString()))));.Cells.Add(tcell);.Rows.Add(tr);++;
}), null);
}
}(Exception ex)
{ }
}
));_thread.Priority =
ThreadPriority.Highest;_thread.Start(this);
}void Button1_Click(object sender,
RoutedEventArgs n)
{(check())
{= new PointF(a.X, a.Y);= new
PointF(b.X, b.Y);= new PointF(e.X, e.Y);icecream = new IceCream(a, b,
e);(icecream);
}{ }
}void Window_Loaded(object sender,
RoutedEventArgs e)
{tbl = null; TableRowGroup trg = null;tblrw
= null; TableCell tblcell = null;.Document.Blocks.Clear();= new Table();= new
TableRowGroup();= new TableRow();= new TableCell();.Blocks.Add(new
Paragraph(new Run("Число точек")));.Cells.Add(tblcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Число
попавших
точек")));.Cells.Add(tblcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Площадь
Монте-Карло")));.Cells.Add(tblcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Точная
площадь")));.Cells.Add(tblcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Относительная
погрешность,%")));.Cells.Add(tblcell);=
new TableCell();.Blocks.Add(new Paragraph(new Run("Время
вычисления,мс")));.Cells.Add(tblcell);.Rows.Add(tblrw);.RowGroups.Add(trg);.Document.Blocks.Add(tbl);
}void Button2_Click(object sender,
RoutedEventArgs ee)
{_A.Text = KoordinX_B.Text = _E.Text
= KoordinY_A.Text = _B.Text = KoordinY_E.Text = "";.IsEnabled =
false;
}void Button3_Click(object sender,
RoutedEventArgs ee)
{= new PointF(10, 0);= new
PointF(10, 10);= new PointF(40, 5);_A.Text = a.X.ToString();_B.Text =
b.X.ToString();_E.Text = e.X.ToString();_A.Text = a.Y.ToString();_B.Text =
b.Y.ToString();_E.Text = e.Y.ToString();.IsEnabled = true;
}
}
}
Файл
MonteKarlo.html (Веб-приложение
на
базе
ASP/Jscript)
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html;
charset=windows-1251">
<title>Расчет площади методом
Монте-Карло</title>
<script>changeAX()
{
document.getElementById("bx").value
= document.getElementById("ax").value;
}changeBX()
{
document.getElementById("ax").value
= document.getElementById("bx").value;
}Reset()
{.KoordinX_A.value =
"";.KoordinX_B.value = "";.KoordinX_E.value =
"";.KoordinY_A.value = "";.KoordinY_B.value =
"";.KoordinY_E.value = "";
}Example()
{.KoordinX_A.value =
"10";.KoordinX_B.value = "10";.KoordinX_E.value =
"40";.KoordinY_A.value = "0";.KoordinY_B.value =
"10";.KoordinY_E.value = "5";
}
</script>
</script>
</head>
<body>
<form action =
"MonteKarlo.asp" method = "POST" name =
"MonteKarlo">
<div id="container">
<img src =
"icecream2.jpg" width="50%" align = "right">
<table border="2"
width="49%" height = "25%" bgcolor="Azure"
bordercolor="Black">
<tr>
<th colspan="3">Координаты
треугольника
ABE</th>
</tr>
<tr>
<td width="14%">Точка
А:</td>
<td
width="43%"><input type="text" value = "10"
name="KoordinX_A" size="20" onchange =
"changeAX();" id = "ax"></td>
<td
width="43%"><input type="text" value = "0"
name="KoordinY_A" size="20" id =
"ay"></td>
</tr>
<tr>
<td width="14%">Точка
B:</td>
<td width="43%"><input
type="text" value = "10" name="KoordinX_B"
size="20" onchange = "changeBX();" id =
"bx"></td>
<td
width="43%"><input type="text" value = "10"
name="KoordinY_B" size="20" id =
"by"></td>
</tr>
<tr>
<td width="14%">Точка
E:</td>
<td width="43%"><input
type="text" value = "40" name="KoordinX_E"
size="20" id = "ex"></td>
<td
width="43%"><input type="text" value = "5"
name="KoordinY_E" size="20" id =
"ey"></td>
</tr>
<tr>
</tr>
</table>
<br></br>
<input type="submit"
value="Расчитать"
name="Okay" width = "20%"></td>
<input type="button"
value="Очистить"
onclick="Reset()" name="Cancel" width = "20%"id =
"Button2">
<input type="button"
value="Контрольный пример"
onclick="Example()" name="Cancel" width = "20%"id
= "Button3">
<br></br>
<table border = "1">
<tr>
<td>Число точек</td>
<td>Число попавших точек</td>
<td>Площадь Монте-Карло</td>
<td>Точная площадь</td>
<td>Относительная погрешность,
%</td>
<td>Время вычисления, с</td>
</tr>
</table>
</div>
</form>
</body>
</html>
Файл
MonteKarlo.asp
<%@ LANGUAGE =
"JScript" %>
<% Server.ScriptTimeOut =210%>
<html>
<head>
<meta
http-equiv="Content-Type" content="text/html;
charset=windows-1251">
<title>Расчет площади методом
Монте-Карло</title>
<script>Reset()
{.KoordinX_A.value =
"";.KoordinX_B.value = "";.KoordinX_E.value =
"";.KoordinY_A.value = "";.KoordinY_B.value =
"";.KoordinY_E.value = "";
}Example()
{.KoordinX_A.value =
"10";.KoordinX_B.value = "10";.KoordinX_E.value =
"40";.KoordinY_A.value = "0";.KoordinY_B.value =
"10";.KoordinY_E.value = "5";
}
</script>
<%xa=Request.Form("KoordinX_A");ya=Request.Form("KoordinY_A");xb=Request.Form("KoordinX_B");yb=Request.Form("KoordinY_B");xe=Request.Form("KoordinX_E");ye=Request.Form("KoordinY_E");Radius
= (yb-ya)/2;CentrX = xa;CentrY = ya+Radius;minX = xa - (yb-ya);maxX = xe;minY =
ya;maxY = yb;k1 = (ye - ya) / (xe - xa);k2 = (ye - yb) / (xe -
xb);RectangleSquare = ((maxX-minX)*(maxY-minY));;pointsCount = 0;totalPoints =
0;t;mca;precission = 0;CircleSquare()
{(Math.PI*Math.pow(Radius,2))/2;
}TriangleSquare()
{ab =
Math.sqrt(Math.pow(xa-xb,2)+Math.pow(ya-yb,2));ae =
Math.sqrt(Math.pow(xa-xe,2)+Math.pow(ya-ye,2));be =
Math.sqrt(Math.pow(xe-xb,2)+Math.pow(ye-yb,2));polperim = (ab + ae +
be)/2;Math.sqrt(polperim*(polperim-ab)*(polperim-ae)*(polperim-be)) ;
}PointInTriangle(x, y)
{((((x-xa)*k1+ya)>=y) ||
(((x-xb)*k2+yb)<=y))
{true;
}
{false;
}
}PointInCirle(x,y)
{
if (x < (CentrX))
{((Math.pow(x - CentrX, 2) +
Math.pow(y - CentrY, 2)) <= Math.pow(Radius, 2));
}{ return false; }
}PointInIceCream(x,y)
{(x>CentrX)
{PointInTriangle(x,y);
}
{PointInCirle(x,y);
}
}increment(i) {1000 * Math.pow(10,
i);
}area()
{CircleSquare() + TriangleSquare();
}Calculate(amountPoints) {startTime
= new Date;= 0;(var i = 0; i < amountPoints; i++)
{x = Math.random() * (maxX - minX) +
minX;y = Math.random() * (maxY - minY) + minY;(PointInIceCream(x,y))
{++;
}
}endTime = new Date;=
(endTime.getTime() - startTime.getTime()) / 1000;=
RectangleSquare*(pointsCount/amountPoints);= Math.abs(((mca - area()) / area())
* 100);
}
%>
</head>
<body>
<form action =
"MonteKarlo.asp" method = "POST" name =
"MonteKarlo">
<div id="container">
<img src =
"icecream2.jpg" width="50%" align = "right">
<table border="2"
width="49%" height = "25%" bgcolor="Azure"
bordercolor="Black">
<tr>
<th colspan="3">Координаты
треугольника
ABE</th>
</tr>
<tr>
<td width="14%">Точка
А:</td>
<td
width="43%"><input type="text" value = <%=xa%>
name="KoordinX_A" size="20"></td>
<td
width="43%"><input type="text" value = <%=ya%>
name="KoordinY_A" size="20"></td>
</tr>
<tr>
<td width="14%">Точка
B:</td>
<td
width="43%"><input type="text" value = <%=xb%>
name="KoordinX_B" size="20"></td>
<td
width="43%"><input type="text" value = <%=yb%>
name="KoordinY_B" size="20"></td>
</tr>
<tr>
<td width="14%">Точка
E:</td>
<td width="43%"><input
type="text" value = <%=xe%> name="KoordinX_E"
size="20"></td>
<td
width="43%"><input type="text" value = <%=ye%>
name="KoordinY_E" size="20"></td>
</tr>
<tr>
</tr>
</table>
<br></br>
<input type="submit"
value="Расчитать"
name="Okay" width = "20%"></td>
<input type="button"
value="Очистить"
onclick="Reset()" name="Cancel" width = "20%"id =
"Button2">
<input type="button"
value="Контрольный пример"
onclick="Example()" name="Cancel" width = "20%"id
= "Button3">
<br></br>
<table border = "1">
<tr>
<td>Число точек</td>
<td>Число попавших точек</td>
<td>Площадь Монте-Карло</td>
<td>Точная площадь</td>
<td>Относительная погрешность,
%</td>
<td>Время вычисления, мс</td>
</tr>
<%for (var i = 3; i < 8; i++)
{= Math.pow(10,i);(totalPoints);
%>
<tr>
<td><%=totalPoints%></td>
<td><%=pointsCount
%></td>
<td><%=mca.toFixed(4)%></td>
<td><%=area().toFixed(4)%></td>
<td><%=t %></td>
</tr>
<% } %>
</table>
</div>
</form>
</body>
</html>
Файл
WS_MonteKarlo.asmx(Веб-приложение
на
базе
WebForm/ASMX/C#)
<%@ WebService
Language="C#" CodeBehind="~/App_Code/WS_MonteKarlo.cs"
Class="WSMK.WS_MonteKarlo" %>
Файл
WS_MonteKarlo.csSystem;System.Collections.Generic;System.Web;System.Drawing;System.Web.Services;
//[WebService(Namespace =
"http://tempuri.org/")]
//[WebServiceBinding(ConformsTo =
WsiProfiles.BasicProfile1_1)]
WSMK
{class WS_MonteKarlo :
System.Web.Services.WebService
{
[WebMethod]float MK_Square(PointF a,
PointF b, PointF e, int count, out int numberPoints, out float real_delta, out
float realsquare, out DateTime start, out DateTime end)
{= DateTime.Now;icecream = new
IceCream(a, b, e);montekarloSquare = icecream.MonteKarloSquare(count, out
numberPoints, out real_delta);= icecream.realSquare();=
DateTime.Now;montekarloSquare;
}
}}
Файл
WBFClientMK.aspx
<%@ Page Language="C#"
AutoEventWireup="true" CodeFile="WBFClientMK.aspx.cs"
Inherits="WBFClientMK" %>
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml">
<head
runat="server">
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1"
runat="server">
<asp:Table ID="Table2"
runat="server" BackColor="White"
BorderColor="Blue" BorderWidth="3px"
GridLines="Both" Width="900px">
<asp:TableRow
runat="server">
<asp:TableCell
runat="server">
<asp:Panel ID="Panel2"
runat="server" > <%--Height="186px"--%>
<p>Координаты точек:</p>
<p>
<asp:Table
runat="server">
<asp:TableRow>
<asp:TableCell Width
="55">
</asp:TableCell>
<asp:TableCell>
Координата Х
</asp:TableCell>
<asp:TableCell Width
="55">
</asp:TableCell>
<asp:TableCell>
Координата
Y
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</p>
<p style="height:
20px">
Точка А:<asp:TextBox
ID="KoordinX_A" runat="server"
CausesValidation="True" AutoPostBack="True"
OnTextChanged="KoordinX_A_TextChanged" >-7</asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator7" runat="server"
ControlToValidate="KoordinX_A"
ErrorMessage="*"></asp:RequiredFieldValidator>
<asp:TextBox
ID="KoordinY_A" runat="server"
CausesValidation="True" AutoPostBack="True"
OnTextChanged="KoordinY_A_TextChanged" >-3</asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator8" runat="server"
ControlToValidate="KoordinY_A"
ErrorMessage="*"></asp:RequiredFieldValidator>
</p>
<p style="height:
20px">
Точка В:<asp:TextBox
ID="KoordinX_B" runat="server"
AutoPostBack="True" CausesValidation="True"
OnTextChanged="KoordinX_B_TextChanged">-7</asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator9" runat="server"
ControlToValidate="KoordinX_B"
ErrorMessage="*"></asp:RequiredFieldValidator>
<asp:TextBox
ID="KoordinY_B" runat="server"
AutoPostBack="True" CausesValidation="True"
OnTextChanged="KoordinY_B_TextChanged">17</asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator10" runat="server"
ControlToValidate="KoordinY_B"
ErrorMessage="*"></asp:RequiredFieldValidator>
</p>
<p style="height:
20px">
Точка
E:<asp:TextBox ID="KoordinX_E" runat="server"
AutoPostBack="True" CausesValidation="True"
OnTextChanged="KoordinX_E_TextChanged">37</asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator11" runat="server"
ControlToValidate="KoordinX_E"
ErrorMessage="*"></asp:RequiredFieldValidator>
<asp:TextBox ID="KoordinY_E"
runat="server" AutoPostBack="True"
CausesValidation="True"
OnTextChanged="KoordinY_E_TextChanged">9</asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator12" runat="server"
ControlToValidate="KoordinY_E"
ErrorMessage="*"></asp:RequiredFieldValidator>
</p>
</asp:Panel>
<asp:Button
ID="Button1" runat="server" Text="Рассчитать"
OnClick="Button1_Click" />
<asp:Button
ID="Button2" runat="server" Text="Очистить"
OnClick="Button2_Click" />
<asp:Button
ID="Button3" runat="server" Text="Контрольный
пример"
OnClick="Button3_Click" CausesValidation="False" />
<p>
<asp:Label ID="Label1"
runat="server" BorderColor="Red"
ForeColor="Red"></asp:Label>
</p>
</asp:TableCell>
<asp:TableCell
runat="server">
<asp:Image ID="Image2"
runat="server" Height="200px" ImageUrl="Image/Мороженкаv2.bmp"
/>
</asp:TableCell>
</asp:TableRow>
</asp:Table>
<br />
<asp:Table ID="Table1"
runat="server" BorderWidth ="3px"
BorderColor="Blue" GridLines="Vertical"
Width="900px">
<asp:TableRow>
<asp:TableCell>Число точек</asp:TableCell>
<asp:TableCell>Число
попавших
точек</asp:TableCell>
<asp:TableCell>Площадь
Монте-Карло</asp:TableCell>
<asp:TableCell>Точная
площадь</asp:TableCell>
<asp:TableCell>Относительная
погрешность,%</asp:TableCell>
<asp:TableCell>Время
вычисления,мс</asp:TableCell>
</asp:TableRow>
<asp:TableRow
runat="server">
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
</asp:TableRow>
<asp:TableRow
runat="server">
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
</asp:TableRow>
<asp:TableRow
runat="server">
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
</asp:TableRow>
<asp:TableRow
runat="server">
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
</asp:TableRow>
<asp:TableRow
runat="server">
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
<asp:TableCell
runat="server"></asp:TableCell>
</asp:TableRow>
</asp:Table>
</form>
</body>
</html>
Файл
WBFClientMK.aspx.csSystem;System.Collections.Generic;System.Web;System.Web.UI;System.Web.UI.WebControls;localhost;partial
class WBFClientMK : System.Web.UI.Page
{_MonteKarlo WS_MK = new
WS_MonteKarlo();a, b, e;void Page_Load(object sender, EventArgs ee)
{
}void Button1_Click(object sender,
EventArgs ee)
{= new PointF();= new PointF();= new
PointF();.X = float.Parse(KoordinX_A.Text);.X = float.Parse(KoordinX_B.Text);.X
= float.Parse(KoordinX_E.Text);.Y = float.Parse(KoordinY_A.Text);.Y =
float.Parse(KoordinY_B.Text);.Y =
float.Parse(KoordinY_E.Text);numberPoints;MK_Square;rel_delta;square;start;
end;start1; end1;(int i = 3; i < 8; i++)
{count = (int)Math.Pow(10, i);=
0;_Square = 0;_delta = 0;= 0;= DateTime.Now;_Square =
WS_MK.MK_Square(a,b,e,count, out numberPoints, out rel_delta, out square, out
start, out end);= DateTime.Now; time1 = end1 - start1;.Rows[i -
2].Cells[0].Text = count.ToString();.Rows[i - 2].Cells[1].Text =
numberPoints.ToString();.Rows[i - 2].Cells[2].Text =
MK_Square.ToString();.Rows[i - 2].Cells[3].Text = square.ToString();.Rows[i -
2].Cells[4].Text = rel_delta.ToString();.Rows[i - 2].Cells[5].Text =
((int)time1.TotalMilliseconds).ToString();
}
}void Button2_Click(object sender,
EventArgs ee)
{_A.Text = "";_B.Text =
"";_E.Text = "";_A.Text = "";_B.Text =
"";_E.Text = "";
}void Button3_Click(object sender,
EventArgs ee)
{.X = 10;.Y = 0;.X = 10;.Y = 10;.X =
40;.Y = 5;_A.Text = a.X.ToString();_B.Text = b.X.ToString();_E.Text =
e.X.ToString();_A.Text = a.Y.ToString();_B.Text = b.Y.ToString();_E.Text =
e.Y.ToString();
}void KoordinX_A_TextChanged(object
sender, EventArgs e)
{Number;(float.TryParse(KoordinX_A.Text,out
Number))
{(Number>float.Parse(KoordinX_E.Text.ToString()))
{.Text = "Координата X точки A не может
быть больше координаты X точки E";
Button1.Enabled = false;;
}
{_B.Text = KoordinX_A.Text;.Text =
"";.Enabled = true;
}
}
{.Text = "Некоректный
ввод
данных";.Enabled
= false;
}
}void KoordinX_B_TextChanged(object
sender, EventArgs e)
{Number;(float.TryParse(KoordinX_B.Text,
out Number))
{(Number >
float.Parse(KoordinX_E.Text.ToString()))
{.Text = "Координата X точки B не может
быть больше координаты X точки E";
Button1.Enabled = false;;
}
{_A.Text = KoordinX_B.Text;.Text =
"";.Enabled = true;
}
}
{.Text = "Некоректный
ввод
данных";.Enabled
= false;
}
}void KoordinY_E_TextChanged(object
sender, EventArgs e)
{Number;(float.TryParse(KoordinY_E.Text.ToString(),out
Number))
{(Number>=float.Parse(KoordinY_B.Text.ToString()))
{.Text = "Координата Y точки E не может
быть больше координаты Y точки В ";
Button1.Enabled = false;;
}
{.Text = "";.Enabled =
true;
}
(Number <=
float.Parse(KoordinY_A.Text.ToString()))
{.Text = "Координата Y точки E не может
быть меньше координаты Y точки А";
Button1.Enabled = false;
}
{.Text = "";.Enabled =
true;
}
}
{
}
}void KoordinX_E_TextChanged(object
sender, EventArgs e)
{Number;(float.TryParse(KoordinX_E.Text,
out Number))
{(Number <=
float.Parse(KoordinX_A.Text.ToString()))
{.Text = "Координата X точки E не может
быть меньше координаты X точки А и В";
Button1.Enabled = false;;
}
{.Text = "";.Enabled =
true;
}
}
{.Text = "Некоректный
ввод
данных";.Enabled
= false;
}
}void KoordinY_A_TextChanged(object
sender, EventArgs e)
{
//////Number;(float.TryParse(KoordinY_A.Text,
out Number))
{(Number >= float.Parse(KoordinY_E.Text.ToString()))
{.Text = "Координата Y точки A не может
быть больше координаты Y точки E";
Button1.Enabled = false;;
}
{.Text = "";.Enabled =
true;
}(Number >=
float.Parse(KoordinY_B.Text.ToString()))
{.Text = "Координата Y точки A не может
быть больше координаты Y точки B";
Button1.Enabled = false;
}
{.Text = "";.Enabled =
true;;
}
///(float.Parse(KoordinY_E.Text.ToString())
>= float.Parse(KoordinY_B.Text.ToString()))
{.Text = "Координата Y точки E не может
быть больше координаты Y точки В ";
Button1.Enabled = false;
}
{.Text = "";.Enabled =
true;
}(float.Parse(KoordinY_E.Text.ToString())
<= float.Parse(KoordinY_A.Text.ToString()))
{.Text = "Координата Y точки E не может
быть меньше координаты Y точки А";
Button1.Enabled = false;
}
{.Text = "";.Enabled =
true;
}
}
{.Text = "Некоректный
ввод
данных";.Enabled
= false;
}
}void KoordinY_B_TextChanged(object
sender, EventArgs e)
{
//////Number;(float.TryParse(KoordinY_B.Text,
out Number))
{(Number <=
float.Parse(KoordinY_E.Text.ToString()))
{.Text = "Координата Y точки B не может
быть меньше координаты Y точки E";
Button1.Enabled = false;;
}
{.Text = "";.Enabled =
true;
}(Number <=
float.Parse(KoordinY_A.Text.ToString()))
{.Text = "Координата Y точки B не может
быть больше координаты Y точки A";
Button1.Enabled = false;
}
{.Text = "";.Enabled =
true;
}
///(float.Parse(KoordinY_E.Text.ToString())
>= float.Parse(KoordinY_B.Text.ToString()))
{.Text = "Координата Y точки E не может
быть больше координаты Y точки В ";
Button1.Enabled = false;
}
{.Text = "";.Enabled =
true;
}(float.Parse(KoordinY_E.Text.ToString())
<= float.Parse(KoordinY_A.Text.ToString()))
{.Text = "Координата Y точки E не может
быть меньше координаты Y точки А";
Button1.Enabled = false;
}
{.Text = "";.Enabled =
true;
}
}
{.Text = "Некоректный
ввод
данных";.Enabled
= false;
}
}
}