This repository was archived by the owner on Nov 13, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathImageWindow.xaml.cs
79 lines (66 loc) · 3.5 KB
/
ImageWindow.xaml.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Drawing;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
namespace Simpson
{
/// <summary>
/// Логика взаимодействия для ImageWindow.xaml
/// </summary>
public partial class ImageWindow : Window
{
public ImageWindow()
{
InitializeComponent();
}
public double MonteCarlo(Bitmap bitmap, double length, int range)
{
Random rnd = new Random();
Bitmap newBitmap = new Bitmap(bitmap);
// range - число всех точек
int hit = 0; //число попаданий
double area = length * length; //площадь
for (int i = 0; i < range; i++)
{
int x = rnd.Next(38, bitmap.Width - 8); // выбор координаты x для точки
int y = rnd.Next(38, bitmap.Height - 35); // выбор координаты y для точки
System.Drawing.Color col = bitmap.GetPixel(x, y); // ставим точку
/*_______________________________________________________________________________________________________________
|При программировании метода Монте-Карло для вычисления одномерного интеграла следует быть аккуратным в случае, |
|когда инимальное и максимальное значения функции имеют разные знаки. |
|При случайных бросках и попаданиях под график функции следует учитывать знаки |
|(при отрицательных значениях функции нужно не суммировать число попаданий, а вычитать, |
|общее число попаданий может быть отрицательным числом). |
-----------------------------------------------------------------------------------------------------------------*/
if (col.G >= 200 && col.B < 200)
{
hit++; //суммируем число попаданий
newBitmap.SetPixel(x, y, System.Drawing.Color.Green);
}
else if(col.B >= 200 && col.G < 200)
{
hit--; //вычитаем число попаданий
newBitmap.SetPixel(x, y, System.Drawing.Color.Blue);
}
else
{
newBitmap.SetPixel(x, y, System.Drawing.Color.Gray);
}
}
using (MemoryStream memory = new MemoryStream())
{
newBitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp);
memory.Position = 0;
BitmapImage bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.StreamSource = memory;
bitmapimage.CacheOption = BitmapCacheOption.OnLoad;
bitmapimage.EndInit();
Image.Source = bitmapimage;
}
return area * hit / range;
}
}
}