Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: GUI и Java FX приложения > Толщина линий после scale() |
Автор: Mirkes 9.12.2013, 16:15 | ||
День добрый! Мне надоело в разных вариантах реализовывать приведение координат из одной системы в другую и я решил воспользоваться стандартным функционалом Java: AffineTransform. Сначала запутался как преобразовывать, но разобрался. А вот потом налетел по крупному.
Все бы ничего, но в моем случае пользовательские координаты меняются от 0 до 1. А толщина линии оказалась в 1 пользовательских координат! То есть вместо диагонали квадрата я получил почти закрашенный квадрат! Осталось чуть-чуть не закрашенного места в двух углах. Теперь вопрос. Как преобразовать координаты и при этом иметь линию по прежнему в 1 пиксель? Можно конечно посчитать как изменилась единица отсчета, но если пользовательские координаты будут сильно разными по осям? тогда вертикальные линии будут толще/тоньше горизонтальных? |
Автор: Mirkes 9.12.2013, 16:36 | ||
Вообще то нашел решение, но оно мне сильно не нравится. Вместо преобразования координат в Graphics я создал отдельное преобразование координат которым потом обработал то, что было в пользовательских координатах и результат уже отрисовал. Но если рисовать нужно что-то сложное придется каждый раз все преобразовывать в Shape, преобразовывать координаты и потом рисовать. Может есть более простой и естественный способ?
И опять мордой об забор ![]() |
Автор: Mirkes 13.12.2013, 17:16 |
Интересно, отсутствие какой либо реакции означает: 1. Никто не пробовал рисовать после Affine transform 2. У всех все работает и такого эффекта не возникает 3. Решение давно известно и не хочется тратить время на очевидное Укажите хотя бы почему нет никакой реакции ![]() |
Автор: Amp 13.12.2013, 17:36 |
У AffineTransform есть же собственный createTransformedShape, который Shape принимает. |
Автор: Amp 14.12.2013, 15:46 |
Да пересчитывай руками все сам. Больше возни, но в перспективе меньше проблем. |
Автор: Mirkes 14.12.2013, 17:44 | ||
Проблему то я решил, но хочется без наворотов обойтись ![]() Рассмотрим такой пример. Я произвел шкалирование scale(20,10). После этого я установил толщину линии в 0.1. При этом вертикальная линия будет в два раза толще горизонтальной. А вот отслеживать разность толщин линий в зависимости от направления - это уже головняк серьезный. |
Автор: Mirkes 17.12.2013, 19:30 | ||
Я хочу уточнить вопрос: Правильно ли я понимаю, что если я произведу аффинные преобразования Graphics2D, то рисовать в нем нормально я уже не смогу? Я провел физически эксперимент и получил ожидаемый эффект: при неравном шкалировании по осям в измененном Graphics2D я никогда не смогу получить горизонтальные, вертикальные и наклонные линии одной толщины. Текст программы приложен, он очень короткий и думаю понятный. Буду благодарен за ответ, даже из одного слова. Я все же надеюсь, что это я чего-то недопонял и возможность рисовать нормально все же существует. Заранее спасибо.
|
Автор: kamre 18.12.2013, 10:24 | ||
В Qt имеется вот такое http://qt-project.org/doc/qt-5/qpen.html#isCosmetic:
Давно в Java ничего не рисовать не приходилось, но может быть что-то аналогичное имеется и в ней. |
Автор: Mirkes 18.12.2013, 13:38 | ||
Спасибо, попробую поискать. |