powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создание полигонов неправильной формы. Математика.
3 сообщений из 28, страница 2 из 2
Создание полигонов неправильной формы. Математика.
    #39826334
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

Я не прогуливал, просто забыл уже все.
Тут остаётся или заново садиться за учебники, или узнавать у тех кто еще помнит геометрию.
...
Рейтинг: 0 / 0
Создание полигонов неправильной формы. Математика.
    #39826355
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.
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.
      private PointLatLng GetPointXY(PointLatLng center, double radius, double angle, double aspect )
        {
            PointLatLng _center = center;
            float delta = 0.01f; //Шаг в радианах между точками
            double a = radius / 100 / 2; // малый радиус
            double b = radius / 100; // большой радиус
            double fi = (angle / 180d) * Math.PI;
            int i = 0;
            const int CROSSING = 157;

            for (float t = 0; t < 2 * Math.PI; t += delta)
            {
                double X = (double)(a * Math.Cos(t) * aspect);
                double Y = (double)(b * Math.Sin(t));
                double X1 = (double)(X * Math.Cos(fi) - Y * Math.Sin(fi));
                double Y1 = (double)(X * Math.Sin(fi) + Y * Math.Cos(fi));

                i++;
                if (i == CROSSING)
                {
                    _center.Lat = X1 + center.Lat;
                    _center.Lng = center.Lng - Y1;
                    return _center;
                }
 
            }
           return _center;

        }

         public List<PointLatLng> GetCirclePoints(PointLatLng center, double radius, double angle,  double aspect)
        {
            List<PointLatLng> points = new List<PointLatLng>();

            //Точки эллипса через полярные координаты
            float delta = 0.01f; //Шаг в радианах между точками

            List<PointF> path = new List<PointF>();
            double a = radius / 100 / 2; // малый радиус
            double b = radius / 100; // большой радиус

            //Угол поворота
            double fi = (angle / 180d) * Math.PI;

            center = GetPointXY(center, radius, angle, aspect );

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

                //Переход к экранным координатам и создание точки для полигона
                PointLatLng p = new PointLatLng(X1 + center.Lat, center.Lng - Y1);
                points.Add(p);
            }
            return points;
        }

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


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