Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 01.07.2011
Сообщений: 29

Отображение надписи в такт изменениям кривой

14.07.2011, 05:27. Показов 1326. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некая ломаная кривая, которая может изгибаться как душе угодно... И нужно как-то аккуратно отобразить надпись рядом с этой кривой, чтобы она смотрелась красиво. Пробовал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                    PointF точка_1 = points[points.Length/2];//беру точку из середины
                    PointF точка_2 = points[points.Length / 2 - 1];
                    float x = точка_1.X + (точка_2.X - точка_1.X) / 2;//точки х и у, в которых буду рисовать надпись
                    float y = точка_1.Y + (точка_2.Y - точка_1.Y) / 2;                   
                    float вектор2х = Math.Abs(точка_2.X - точка_1.X);
                    float вектор2y = Math.Abs(точка_2.Y - точка_1.Y);
                    float вектор1х = Math.Abs(точка_2.X - точка_1.X);
                    float вектор1y = 0;
                    Vector vector1 = new Vector(вектор1х, вектор1y);
                    Vector vector2 = new Vector(вектор2х, вектор2y);
                    float угол = (float)Vector.AngleBetween(vector1, vector2);
                    G.TranslateTransform(x, y);
                    G.RotateTransform(угол);                        
                    G.DrawString(label, font, Brushes.Black, 0, 0);
                    G.RotateTransform(-угол);
                    G.TranslateTransform(-x, -y);
Получается, в общем то... но это нормально работает, только если линия достаточно прямая. В противном случае получаются всяческие некрасивые завертоны.
Кто-нибудь может что-нибудь посоветовать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.07.2011, 05:27
Ответы с готовыми решениями:

DBNavigator - скрытие кнопок и отображение надписи
Здравствуйте! Возникла проблема с работой DBNavigator. Не могу сделать чтобы определенные кнопки навигатора стали скрытыми и при...

Отображение кривой поиска на поверхности
Собственно задача состоит в том, чтобы показать на графике поверхности путь, по которому происходит поиск экстремума. Поверхность...

Функция Arc. Зеркальное отображение кривой.
Привет. С помощью функции Arc у меня строится некоторая кривая, что и как мне преобразовать чтобы получить зеркальное отображение уже...

6
 Аватар для chessman1
167 / 96 / 23
Регистрация: 13.03.2011
Сообщений: 402
14.07.2011, 20:24
Картинку можно посмотреть?
0
68 / 66 / 19
Регистрация: 27.12.2008
Сообщений: 212
14.07.2011, 20:40
Цитата Сообщение от Alasar Посмотреть сообщение
может изгибаться как душе угодно
если как угодно - то тогда либо анализировать все пиксели, в области рисования, либо выводить за пределами этой области. Либо сделать надпись передвигаемой
0
2 / 2 / 0
Регистрация: 01.07.2011
Сообщений: 29
15.07.2011, 02:10  [ТС]
Цитата Сообщение от chessman1 Посмотреть сообщение
Картинку можно посмотреть?
Хм... ну вот она. Линии там видно вроде.
Цитата Сообщение от Xero201 Посмотреть сообщение
если как угодно - то тогда либо анализировать все пиксели, в области рисования, либо выводить за пределами этой области.
Нет, нужно именно в области рисования. Алгоритм проверки какой-нибудь не подскажите? Пробовал что-то вроде: "если длина надписи вылезает за граничную точку, то повернуть надпись на угол, соответсвующий вектору на точку вперед". Особых изменений не заметил...
Миниатюры
Отображение надписи в такт изменениям кривой  
0
2 / 2 / 0
Регистрация: 01.07.2011
Сообщений: 29
15.07.2011, 04:13  [ТС]
Для примера, можно из одной программы скрин посмотреть. Там надпись либо идет без разворота, либо поворачивается по направлению движения дороги... и все вроде ничего смотрится. Если кто подскажет алгоритм работы, буду очень признателен.
Миниатюры
Отображение надписи в такт изменениям кривой  
0
68 / 66 / 19
Регистрация: 27.12.2008
Сообщений: 212
15.07.2011, 12:53
Цитата Сообщение от Alasar Посмотреть сообщение
. и все вроде ничего смотрится
На этой картинке поворачиваются только названия речек (и не удачно), дорожные надписи все без разворота.
+ По собственному опыту скажу, что не надо поворачивать надписи, когда едешь за рулем не удобно еще и карту вертеть.

Цитата Сообщение от Alasar Посмотреть сообщение
Алгоритм проверки какой-нибудь не подскажите?
Имеется ввиду сохранить карту в виде массива из 0 (пусто) и 1 (дорога), для чего перебрать все пиксели по цвету (цвет дороги должен быть уникальным). А потом уже его анализировать.
Для скорости можно ставить в соответствие одной ячейки массива квадрат пикселей 5х5 (или другой размер), определив какой процент будет считаться за пустоту, а какой за дорогу (например, если в квадрате меньше 10 точек принадлежат дороге, то считать его пустым, а если больше - заполненным).
Но по-моему ты усложняешь.
1
2 / 2 / 0
Регистрация: 01.07.2011
Сообщений: 29
18.07.2011, 08:17  [ТС]
Если у кого возникнет похожая задача, то приблизительно решить ее можно следующим образом...
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
                                float fCosY = (float)Math.Cos((points[0].Y * c_PI / 180));
                                float part_l = 0;
                                for (int a = 0; a < points.Length - 1; ++a)
                                {
                                    PointF p0 = points[a];
                                    PointF p1 = points[a + 1];
                                    part_l += (float)Math.Sqrt(((p1.X - p0.X) * (p1.X - p0.X) * fCosY * fCosY + (p1.Y - p0.Y) * (p1.Y - p0.Y)));
                                }
                                float part_l2 = 0;
                                for (int a = 0; a < points.Length - 1; ++a)
                                {
                                    PointF p0 = points[a];
                                    PointF p1 = points[a + 1];
                                    float l = (float)Math.Sqrt(((p1.X - p0.X) * (p1.X - p0.X) * fCosY * fCosY + (p1.Y - p0.Y) * (p1.Y - p0.Y)));
                                    if (part_l2 + l > part_l / 2)
                                    {
                                        ptLabel_x = (p0.X + p1.X) / 2;
                                        ptLabel_y = (p0.Y + p1.Y) / 2;
                                        G.TranslateTransform(ptLabel_x, ptLabel_y);
                                        //Vector vector1 = new Vector((p1.X - p0.X) * fCosY,p1.Y - p0.Y);
                                        Vector vector2 = new Vector(this.Width - 0, 0 - 0);
                                        Vector vector1 = new Vector(p1.X - ptLabel_x - 0, p1.Y - ptLabel_y - 0);
                                        label_angle = (float)Vector.AngleBetween(vector2, vector1);
                                        if (label_angle >= 180 / 2)
                                            label_angle -= 180;
                                        if (label_angle < -180 / 2)
                                            label_angle += 180;
                                        G.TranslateTransform(-ptLabel_x, -ptLabel_y);
                                        break;
                                    }
                                    else
                                        part_l2 += l;
                                }
                                G.TranslateTransform(ptLabel_x, ptLabel_y);                            
                                G.RotateTransform(label_angle);
                                G.DrawString(label, font, Brushes.Black, 0 - ширина_строки / 2, 0);
                                G.RotateTransform(-label_angle);
                                G.TranslateTransform(-ptLabel_x, -ptLabel_y);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.07.2011, 08:17
Помогаю со студенческими работами здесь

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

Написать отчет, по кадровым и денежным изменениям сотрудников
То есть если у сотрудника менялись должность и подразделения или величина постоянной надбавки, или оклад, в отчете должно выводить на что и...

Изменения размера шрифтов в Windows приводят к изменениям на форме
кто-нить сталкивался со следующей проблемой? При переключении в windows с small fonts на large - приложение меняет вид - т.е....

Изменение расчетного шага приводит к значительным изменениям в расчетах
Здравствуйте! Прошу помощи) Надеюсь, что вопрос не сложный, но разобраться никак не могу. По заданию надо находить ток в каждый момент...

Отображение массива в виде непрерывной кривой, Chart. "Зубцы" при соединении соседних точек
Приветствую многоуважаемых участников форума. Суть задачи: требуется отобразить в виде непрерывной кривой некоторый массив точек....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru