Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание полигонов неправильной формы. Математика. / 25 сообщений из 28, страница 1 из 2
07.06.2019, 14:01
    #39824036
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Я хочу отобразить зону загрязнения на GMAP.NET, при штиле она имеет вид круга, нарисовать его можно просто.

Код: c#
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.
      public List<PointLatLng> GetCirclePoints(PointLatLng center, double radius, int count)
        {
            // List for results.
            List<PointLatLng> points = new List<PointLatLng>();

            // Size of one segement.
            double seg = Math.PI * 2 / count;

            // Calculate the points requested.
            for (int i = 0; i < count; i++)
            {
                // Calculate the angle required.
                double angle = seg * i;

                // Calculate the difference in km into each direction.
                double dx = Math.Cos(angle) * radius;
                double dy = Math.Sin(angle) * radius;
 
                // Calculate the degree in ° to change.
                double latitude = center.Lat + dy / 110.574;
                double langitude = center.Lng + dx / (111.320 * Math.Cos(latitude * 2 * Math.PI / 360));
                PointLatLng gpspoint = new PointLatLng(latitude, langitude);
                points.Add(gpspoint);
            }

            return points;
        }



Но как нарисовать полигон неправильной формы? Например когда дует южный ветер, пятно выбросов имеет форму параболы.
Подскажите как сделать такой полигон
...
Рейтинг: 0 / 0
07.06.2019, 17:13
    #39824190
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Пятно выбросов имеет форму эллипса

...
Рейтинг: 0 / 0
07.06.2019, 17:52
    #39824217
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Cat2,

В реальной жизни нет. Больше похоже на дым от костра.
...
Рейтинг: 0 / 0
07.06.2019, 18:15
    #39824244
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Eolt,
Что-то я на вижу на реальной карте параболы, которую Вы хотели нарисовать.
В реальной жизни ветры разные дуют и Ваш "парабола" гораздо дальше от действительности, чем эллипс.
...
Рейтинг: 0 / 0
07.06.2019, 18:17
    #39824248
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Cat2,
Правильный ответ - кривая 2ого порядка
...
Рейтинг: 0 / 0
07.06.2019, 18:26
    #39824257
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
pationCat2,
Правильный ответ - кривая 2ого порядка
Нет
...
Рейтинг: 0 / 0
07.06.2019, 18:54
    #39824284
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Как бы я решал задачу.

Построение эллипса при условии , что его большой диаметр не прямая, а кривая, которая есть функция от направления и силы ветра
...
Рейтинг: 0 / 0
07.06.2019, 23:32
    #39824343
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Eolt,
если есть данные, построй просто замкнутый регион и всё
а если данных нет, то какой смысл от сочинения? эллипс - и всем понятно что нарисована схематичная условность

PS: обычно правда ещё и мощность в виде цвета наносят
...
Рейтинг: 0 / 0
08.06.2019, 00:21
    #39824351
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Cat2Как бы я решал задачу.

Построение эллипса при условии , что его большой диаметр не прямая, а кривая, которая есть функция от направления и силы ветра

И как построить элипс? Допустим эпицентр: X=4, Y=2
...
Рейтинг: 0 / 0
08.06.2019, 14:35
    #39824425
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
EoltCat2Как бы я решал задачу.

Построение эллипса при условии , что его большой диаметр не прямая, а кривая, которая есть функция от направления и силы ветра

И как построить э л липс? Допустим эпицентр: X=4, Y=2
y = sin(anlge) * kconst + x0;
x = cos(angle) * kelips + y0;
не?

если точка лежит в области эллипса, вычисляем вектор из локального центра и до его окружности на прямой, где лежит наша точка, до точки лежащей на прямой от центров эллипсов в зависимости от расстояния от центров (если их много складываем вектора) до нашей точки * на какой то коэффициент и смещаем нашу точку в заданную. но это не научный подход, офк :) я не синоптик и не математик :D
для ускорения можно использовать матричные трансформации. (аффинные преобразования), а в WPF с учётом его векторности, на много проще, как мне кажется. построить нужную геометрию, разместить её в layout, и всё, что душе угодно из коробки. в WinForms, всё сложнее, как мне кажется. (есть и 3D, то есть ты можешь строить полусферы и сферы)
...
Рейтинг: 0 / 0
08.06.2019, 22:56
    #39824518
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
EoltИ как построить элипс? Допустим эпицентр: X=4, Y=2классика же: Алгоритм Брезенхема
с дискретностью возиться смысла у тебя нет, просто афинные преобразования нанесёшь и всё

PS: ну это если в дебри не углубляться и не искать оптимизаций
...
Рейтинг: 0 / 0
09.06.2019, 02:02
    #39824528
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Только сейчас понял, можно же использовать коэффициент сжатия окружности. И тогда получится элипс.
Всего один параметр добавить.

Код: c#
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.
   public List<PointLatLng> GetCirclePoints(PointLatLng center, double radius, int count)
        {
            center.Lat = center.Lat + (radius/120);

            // List for results.
            List<PointLatLng> points = new List<PointLatLng>();

            // Size of one segement.
            double seg = Math.PI * 2 / count;

            double aspect = 0.5;

            // Calculate the points requested.
            for (int i = 0; i < count; i++)
            {
                // Calculate the angle required.
                double angle = seg * i   ;

                // Calculate the difference in km into each direction.
                double dx =   Math.Cos(angle) * radius * aspect ;
                double dy =   Math.Sin(angle) * radius  ;
 
                // Calculate the degree in ° to change.
                double latitude = center.Lat + dy / 110.574 ;
                double langitude = center.Lng + dx / (111.320 * Math.Cos(latitude * 2 * Math.PI / 360));
        
                PointLatLng gpspoint = new PointLatLng(latitude, langitude);
                points.Add(gpspoint);
            }

            return points;
        } 
...
Рейтинг: 0 / 0
09.06.2019, 02:13
    #39824531
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Непонятно, как развернуть элипс под 45% к примеру. Сейчас он стоит на 90%
...
Рейтинг: 0 / 0
09.06.2019, 03:05
    #39824534
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Eolt,

используй аффинные преобразования, это же просто
...
Рейтинг: 0 / 0
09.06.2019, 12:13
    #39824576
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Roman MejtesEolt,

используй аффинные преобразования, это же просто

можно пример как?
...
Рейтинг: 0 / 0
09.06.2019, 12:15
    #39824577
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
EoltНепонятно, как развернуть элипс под 45% к примеру. Сейчас он стоит на 90%
Для построения областей любой сложности используется Graphics.FillPath(Brush, GraphicsPath).
https://docs.microsoft.com/ru-ru/dotnet/api/system.drawing.graphics.fillpath?view=netcore-2.1
...
Рейтинг: 0 / 0
09.06.2019, 13:36
    #39824608
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Cat2Для построения областей любой сложности используется Graphics.FillPath(Brush, GraphicsPath).
https://docs.microsoft.com/ru-ru/dotnet/api/system.drawing.graphics.fillpath?view=netcore-2.1

В моем случае это не подходит. Я рисую полигон в контроле GMAP через задание коллекции точек PointLatLng
...
Рейтинг: 0 / 0
11.06.2019, 16:48
    #39825487
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
EoltCat2Для построения областей любой сложности используется Graphics.FillPath(Brush, GraphicsPath).
https://docs.microsoft.com/ru-ru/dotnet/api/system.drawing.graphics.fillpath?view=netcore-2.1

В моем случае это не подходит. Я рисую полигон в контроле GMAP через задание коллекции точек PointLatLng
И рисуйте. Если взять достаточно много точек, то получится кривая
...
Рейтинг: 0 / 0
11.06.2019, 20:31
    #39825599
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Cat2,

не понял как, может пример кода покажете?
...
Рейтинг: 0 / 0
12.06.2019, 12:36
    #39825732
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Что-то я сегодня добрый

Код: c#
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.
namespace RotatePoligon
{
    public partial class Form1 : Form
    {
        int X0, Y0, R;
        public Form1()
        {
            InitializeComponent();
            X0 = pictureBox.Width / 2;
            Y0 = pictureBox.Height / 2;
            R = X0 / 2;
        }

        private void DrawButton_Click(object sender, EventArgs e)
        {
            //Точки эллипса через полярные координаты
            float delta = 0.01f; //Шаг в радианах между точками
            
            List<PointF> path = new List<PointF>();
            float a = R / 2; // малый радиус
            float b = R; // большой радиус

            //Угол поворота
            float fi = (float)AngleNumericUpDown.Value / 180f * (float)Math.PI;

            
            for (float t = 0; t < 2 * Math.PI; t += delta)
            {
                
                float X = (float)(a * Math.Cos(t));
                float Y = (float)(b * Math.Sin(t));
                //Поворот
                float X1 = (float)(X * Math.Cos(fi) - Y * Math.Sin(fi));
                float Y1 = (float)(X * Math.Sin(fi) + Y * Math.Cos(fi));

                //Переход к экранным координатам и создание точки для полигона
                PointF p = new PointF(X1 + X0, Y0 - Y1);
                path.Add(p);
            }
            Graphics g = Graphics.FromHwnd(pictureBox.Handle);
            g.FillPolygon(new SolidBrush(Color.FromArgb(32,255,0,0)), path.ToArray());
        }
    }
}
...
Рейтинг: 0 / 0
12.06.2019, 12:37
    #39825734
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Проект
...
Рейтинг: 0 / 0
12.06.2019, 21:12
    #39825852
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
...
Рейтинг: 0 / 0
12.06.2019, 23:36
    #39825873
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Eolt,

Офигенно! Спасибо
...
Рейтинг: 0 / 0
13.06.2019, 19:24
    #39826322
Eolt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
Cat2,

А как доработать ваш алгоритм, чтобы сместить эллипс так, чтобы его центр оказался на самом краю эллипса?

Cейчас он находится в центре (левый скрин) а нужно чтобы выглядело как на правом рисунке
...
Рейтинг: 0 / 0
13.06.2019, 20:03
    #39826331
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание полигонов неправильной формы. Математика.
EoltА как доработать ваш алгоритм, чтобы сместить эллипс так, чтобы его центр оказался на самом краю эллипса?
Аналитическую геометрию Вы прогуляли, про афинные преобразования впервые услышали.
Удачи в самообразовании! Тут форум по программированию, а не ликбез по математике.

Сегодня я злой
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание полигонов неправильной формы. Математика. / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]