Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Я хочу отобразить зону загрязнения на GMAP.NET, при штиле она имеет вид круга, нарисовать его можно просто.

      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;
        }


Но как нарисовать полигон неправильной формы? Например когда дует южный ветер, пятно выбросов имеет форму параболы.
Подскажите как сделать такой полигон

К сообщению приложен файл. Размер - 66Kb
7 июн 19, 14:01    [21904514]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Пятно выбросов имеет форму эллипса

Картинка с другого сайта.
7 июн 19, 17:13    [21904756]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Cat2,

В реальной жизни нет. Больше похоже на дым от костра.

К сообщению приложен файл. Размер - 101Kb
7 июн 19, 17:52    [21904800]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Eolt,
Что-то я на вижу на реальной карте параболы, которую Вы хотели нарисовать.
В реальной жизни ветры разные дуют и Ваш "парабола" гораздо дальше от действительности, чем эллипс.
7 июн 19, 18:15    [21904831]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
pation
Member

Откуда: Москва
Сообщений: 4448
Cat2,
Правильный ответ - кривая 2ого порядка
7 июн 19, 18:17    [21904835]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
pation
Cat2,
Правильный ответ - кривая 2ого порядка

Нет
7 июн 19, 18:26    [21904849]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Как бы я решал задачу.

Построение эллипса при условии , что его большой диаметр не прямая, а кривая, которая есть функция от направления и силы ветра
7 июн 19, 18:54    [21904883]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4655
Eolt,
если есть данные, построй просто замкнутый регион и всё
а если данных нет, то какой смысл от сочинения? эллипс - и всем понятно что нарисована схематичная условность

PS: обычно правда ещё и мощность в виде цвета наносят
7 июн 19, 23:32    [21904986]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Cat2
Как бы я решал задачу.

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


И как построить элипс? Допустим эпицентр: X=4, Y=2

К сообщению приложен файл. Размер - 9Kb
8 июн 19, 00:21    [21905001]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
Eolt
Cat2
Как бы я решал задачу.

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


И как построить эллипс? Допустим эпицентр: X=4, Y=2

y = sin(anlge) * kconst + x0;
x = cos(angle) * kelips + y0;
не?

если точка лежит в области эллипса, вычисляем вектор из локального центра и до его окружности на прямой, где лежит наша точка, до точки лежащей на прямой от центров эллипсов в зависимости от расстояния от центров (если их много складываем вектора) до нашей точки * на какой то коэффициент и смещаем нашу точку в заданную. но это не научный подход, офк :) я не синоптик и не математик :D
для ускорения можно использовать матричные трансформации. (аффинные преобразования), а в WPF с учётом его векторности, на много проще, как мне кажется. построить нужную геометрию, разместить её в layout, и всё, что душе угодно из коробки. в WinForms, всё сложнее, как мне кажется. (есть и 3D, то есть ты можешь строить полусферы и сферы)
8 июн 19, 14:35    [21905138]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4655
Eolt
И как построить элипс? Допустим эпицентр: X=4, Y=2
классика же: Алгоритм Брезенхема
с дискретностью возиться смысла у тебя нет, просто афинные преобразования нанесёшь и всё

PS: ну это если в дебри не углубляться и не искать оптимизаций
8 июн 19, 22:56    [21905268]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Только сейчас понял, можно же использовать коэффициент сжатия окружности. И тогда получится элипс.
Всего один параметр добавить.

   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;
        } 


К сообщению приложен файл. Размер - 103Kb
9 июн 19, 02:02    [21905284]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Непонятно, как развернуть элипс под 45% к примеру. Сейчас он стоит на 90%
9 июн 19, 02:13    [21905287]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3351
Eolt,

используй аффинные преобразования, это же просто
9 июн 19, 03:05    [21905290]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Roman Mejtes
Eolt,

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


можно пример как?
9 июн 19, 12:13    [21905376]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Eolt
Непонятно, как развернуть элипс под 45% к примеру. Сейчас он стоит на 90%

Для построения областей любой сложности используется Graphics.FillPath(Brush, GraphicsPath).
https://docs.microsoft.com/ru-ru/dotnet/api/system.drawing.graphics.fillpath?view=netcore-2.1
9 июн 19, 12:15    [21905378]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Cat2
Для построения областей любой сложности используется Graphics.FillPath(Brush, GraphicsPath).
https://docs.microsoft.com/ru-ru/dotnet/api/system.drawing.graphics.fillpath?view=netcore-2.1


В моем случае это не подходит. Я рисую полигон в контроле GMAP через задание коллекции точек PointLatLng
9 июн 19, 13:36    [21905431]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Eolt
Cat2
Для построения областей любой сложности используется Graphics.FillPath(Brush, GraphicsPath).
https://docs.microsoft.com/ru-ru/dotnet/api/system.drawing.graphics.fillpath?view=netcore-2.1


В моем случае это не подходит. Я рисую полигон в контроле GMAP через задание коллекции точек PointLatLng

И рисуйте. Если взять достаточно много точек, то получится кривая
11 июн 19, 16:48    [21906893]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Cat2,

не понял как, может пример кода покажете?
11 июн 19, 20:31    [21907044]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Что-то я сегодня добрый

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());
        }
    }
}


К сообщению приложен файл. Размер - 43Kb
12 июн 19, 12:36    [21907277]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Проект

К сообщению приложен файл (RotatePoligon.zip - 17Kb) cкачать
12 июн 19, 12:37    [21907279]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 4655
Eolt,

https://compgraphics.info/2D/affine_transform.php
12 июн 19, 21:12    [21907458]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Eolt,

Офигенно! Спасибо
12 июн 19, 23:36    [21907514]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Eolt
Member

Откуда:
Сообщений: 1474
Cat2,

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

Cейчас он находится в центре (левый скрин) а нужно чтобы выглядело как на правом рисунке

К сообщению приложен файл. Размер - 110Kb
13 июн 19, 19:24    [21908200]     Ответить | Цитировать Сообщить модератору
 Re: Создание полигонов неправильной формы. Математика.  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145601
Eolt
А как доработать ваш алгоритм, чтобы сместить эллипс так, чтобы его центр оказался на самом краю эллипса?

Аналитическую геометрию Вы прогуляли, про афинные преобразования впервые услышали.
Удачи в самообразовании! Тут форум по программированию, а не ликбез по математике.

+
Сегодня я злой
13 июн 19, 20:03    [21908217]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить