![]() |
|
|
![]()
|
|
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Фрагмент метода вывода текста по дуге:
Вывожу текст по дуге окружности. Для этого я, исходя из радиуса и ширины символа, вычисляю длину хорды отдельно для каждого символа, равную ширине этого символа (QFontMetricsF::width(QString)) (1), тем самым добиваясь одинаковых промежутков между символами. Далее я вывожу длину всей дуги, вычисленную исходя из угла охвата всей надписи и радиуса (2). Еще ниже я вывожу длину всей надписи, которая по сути равна сумме всех хорд (3). А теперь главное: длина надписи (сумма всех хорд) всегда больше длины дуги, что явно невозможно - должно быть ровно наоборот (хорда всегда меньше дуги). Вопрос что не так? P.S: Экспериментально выяснил, что "врет" именно второй вывод (3). Думал проблема из-за особенностей в методе fm.width(), но это не так - ведь его же я использую и при расчете хорды (1), и сумма ширин символов совпадает с шириной всего текста. P.P.S: Интересно, что при увеличении радиуса разница между выводами стремится к нулю, что в принципе правильно - дуги при неизменных ширин символов становятся все короче и короче. Но дуга должна быть всегда больше хорды, но это, как я уже писал выше, не выполняется. Это сообщение отредактировал(а) wowka19 - 7.5.2014, 03:12 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Все правильно. Ты не вписываешь буквы внутри окружности, а описываешь их снаружи - поэтому длина окружности меньше, чем длина строки.
|
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Нет. Это невозможно. Я ведь четко вычисляю позицию начала символа на самой окружности - см. рисунок:
![]() Немного поясню преобразования:
На примере "ШШШШ": как видно надпись занимает без малого половину окружности. В строке (2) участвующий в вычислении угол охвата всей надписи как раз равен ~171 градусу, что похоже на правду, в то время как участвующий в (3) fm.width(text_) будет охватывать fm.width(text_) / 2*M_PI*radius_ * 360 градусов, что в итоге (я считал) дает больше 180 градусов. Что не так? Это сообщение отредактировал(а) wowka19 - 7.5.2014, 08:54 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
У тебя буквы наезжают друг на друга - ты вычисляешь угол исходя из того, что буквы будут вне окружности, а выводишь их по хорде.
Для расчета угла по хорде нужно использовать не арктангенс, а арксинус
Это сообщение отредактировал(а) math64 - 7.5.2014, 08:54 |
|||
|
||||
| wowka19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Не выходит - символы еще сильнее наезжают друг на друга
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
А, да забыл: нужно выравнивение по центру или
|
|||
|
||||
| wowka19 |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 30.11.2011 Репутация: нет Всего: нет |
Спасибо. Получилось. Но matrix я не менял - всего лишь изменил формулу расчета deltaAngle. И правда я считал неверно (запутался). Вот верный расчет:
Теперь (1) > (2), как и должно быть. Но теперь возникло другое непонятное поведение: Так как радиус может быть и отрицательным (чтобы текст "гнулся" в другую сторону), то мне для универсальности необходимо сделать так, чтобы символы пересекались с окружностью не крайними нижними точками, а крайними центральными. Для этого, казалось бы пустяка необходимо сместить символ на половину его высоты, т.е. заменить строчку (!!! 3 !!!)
на
Но символы уползают не на половину высоты а на всю. Лишь поделив высоту на ~4 (painter.drawText(0, fm.height()/4, ch)), я добиваюсь своего. Но почему так??? P.S: я понимаю, что fm.height() - это максимальная высота, но я для теста я использую заглавные буквы Ш: "ШШШШ". И я проверил, что fm.height() почти равна ширине "Ш". Кстати отсюда вытекает вопрос: Какую линию считать за середину (по высоте) надписи, чтобы именно эту (воображаемую) линию изгибать? Это сообщение отредактировал(а) wowka19 - 8.5.2014, 14:40 |
||||||
|
|||||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |