powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание полигонов неправильной формы. Математика.
25 сообщений из 28, страница 1 из 2
Создание полигонов неправильной формы. Математика.
    #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
Создание полигонов неправильной формы. Математика.
    #39824190
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Пятно выбросов имеет форму эллипса

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

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

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

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

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

И как построить элипс? Допустим эпицентр: X=4, Y=2
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #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
Создание полигонов неправильной формы. Математика.
    #39824518
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltИ как построить элипс? Допустим эпицентр: X=4, Y=2классика же: Алгоритм Брезенхема
с дискретностью возиться смысла у тебя нет, просто афинные преобразования нанесёшь и всё

PS: ну это если в дебри не углубляться и не искать оптимизаций
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #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
Создание полигонов неправильной формы. Математика.
    #39824531
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно, как развернуть элипс под 45% к примеру. Сейчас он стоит на 90%
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #39824534
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

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

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

можно пример как?
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #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
Создание полигонов неправильной формы. Математика.
    #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
Создание полигонов неправильной формы. Математика.
    #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
Создание полигонов неправильной формы. Математика.
    #39825599
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

не понял как, может пример кода покажете?
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #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
Создание полигонов неправильной формы. Математика.
    #39825734
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Проект
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #39825852
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #39825873
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

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

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

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

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


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