Рисования фигур с помощью Graphics в Java
Ниже перечислено несколько методов класса Graphics, которые используются для рисования фигур:
- drawLine
- drawRectangle
- drawRoundRect
- draw3DRect
- drawPolygon
- drawPolyline
- drawOval
- drawArc
Для них существуют соответствующие fill-методы заполнения фигур, которые были предусмотрены в классе Graphics начиная с JDK 1.0. В Java 2D API используется совершенно другая, объектно-ориентированная модель, где вместо методов применяются перечисленные ниже классы:
- Line2D
- Rectangle2D
- RoundRectangle2D
- Ellipse2D
- Arc2D
- QuadCurve2D
- CubicCurve2D
- GeneralPath
Данные классы реализуют интерфейс Shape.
Кроме того, предусмотрен класс точки Point2D, который описывает точку с координатами х и у. Точки полезны для определения фигур, но сами по себе фигурами не являются.
Для того чтобы нарисовать фигуру, нужно создать экземпляр класса, который реализует интерфейс Shape, а затем вызвать метод draw для класса Graphics2D.
Классы Line2D, Rectangle2D, RoundRectangle2D, Ellipse2D и Arc2D соответствуют методам drawLine(), drawRectangle(), drawRoundRect(), drawOval() и drawArc(). Для понятия «трехмерный треугольник»(3D rectangle) не предусмотрено соответствующего метода draw3DRect(). Однако в Java 2D API поддерживаются два дополнительных класса для рисования кривых второго и третьего порядков.
Для рисования многоугольников не предусмотрено отдельного класса (вроде Polygon2D), а предлагается класс GeneralPath, который описывает контуры, состоящие из линий и кривых второго и третьего порядков. Класс GeneralPath можно использовать для описания многоугольника.
Перечисленные ниже классы наследуют общий класс RectangularShape:
- Rectangle2D
- RoundRectangle2D
- Ellipse2D
- Arc2D
Известно, что эллипсы и дуги не являются прямоугольниками, но их можно вписать в прямоугольник.
Каждый из классов, название которого заканчивается суффиксом 2D, имеет два подкласса, отличающейся способом указания координат(они задаются в виде чисел типа
Для внутреннего представления координат все графические классы используют данные типа float, поскольку для них требуется меньше места для хранения, чем для данных типа double, к тому же они поддерживают достаточную точность для геометрических вычислений.
Однако, в языке Java обработка чисел float выполняется очень громоздкими и неуклюжими способами. Поэтому большинство методов графических классов используют параметры типа double и возвращают значение типа double.
Canvas DrawLine не гладкая — ошибки и другие проблемы
Soumya_Gautam
#1Уважаемое сообщество,
Когда я пытаюсь нарисовать быстрые каракули с помощью блока DrawLine холста, кривые каракулей не получаются плавными. Расстояние между PrevX/Y и CurrentX/Y очень велико (десятки миллиметров), поэтому кривые выглядят как многоугольники, а не как гладкие кривые. Я не уверен, почему расстояние между двумя последовательными точками такое большое.
Я также попытался добавить DrawCircle вместе с DrawLine в блок Canvas Dragged. Это сгладило края линий, но в точках поворота они не искривлены, а имеют резкие угловые повороты.
Эта ошибка меня очень беспокоит. Я пытаюсь создать приложение для рисования. Но эти многоугольные линии выглядят очень раздражающими. Пожалуйста помоги.
Заранее большое спасибо.
Сумья
dora_paz
#2
Для создания более гладкой линии попробуйте следующий код
1 Нравится
SteveJG
#3
https://groups.
google.com/g/mitappinventortest/c/zu5E9OvQKs4/m/Hp2l-KZHDQAJ может помочь. и https://groups.google.com/g/mitappinventortest/c/u3g4NuHjKb8/m/1gljCmrvHQAJ
Soumya_Gautam
#4
Спасибо dora_paz, я попробовал эту же последовательность. но бесполезно. Линия по-прежнему не гладкая на кривых.
dora_paz
#5
С приведенным выше кодом это выглядит на моем телефоне из приложения, которое я сделал
Patryk_F
#6
Рисовать нужно точками, а не линиями
Soumya_Gautam
#7
Привет, Патрик, я тебя не понял. Способ рисования кривой — использование линии рисования. Точки разбросаны и не соединяются в одну кривую. Пожалуйста, поделитесь примером кода блока, если можете. Спасибо
Soumya_Gautam
#8
Дорогая dora_paz, я не знаю, как быстро ты рисуешь. Пожалуйста, посмотрите на мои каракули. Вышеуказанный медленнее и намного более плавный по сравнению с нижним.
Я нарисовал нижнюю кривую быстрее, и кривая исказилась. Чем меньше ширина линии, тем уродливее это выглядит.
Пожалуйста, посмотрите, есть ли у вас решение. Я не могу ожидать, что пользователи моего приложения всегда будут рисовать медленнее.
Сумья_Гаутам
#9
Патрик_Ф
#10
По очкам выглядит не очень. Я не думаю, что вы можете помочь. Canva слишком медленная, при быстрых движениях не успеет прочитать все промежуточные точки и тогда рисует прямые линии.
Сумья_Гаутам
#11
Да Патрик. Я понимаю этот момент. Но мои точки появляются слишком далеко. Любой способ убедиться, что холст выбирает более близкие точки для рисования линии. Спасибо.
Патрик_Ф
#12
Он не будет выбирать более близкие точки, потому что не может «видеть» их при быстрых движениях. Но нужны ли вам такие быстрые движения? При обычном рисовании все нормально. Быстрые движения чешутся, а когда морщишь, форма наверное не важна 😉
ТИМАИ2
№13
Кто-нибудь упомянул настройку адаптивного размера? Видимо это может помочь.
..
Patryk_F
№14
Отзывчивый — это значение по умолчанию в App Inventor. При быстрых движениях, как ответных, так и фиксированных, он создает прямые линии. Прямые линии выглядят зубчатыми только в фиксированном режиме.
ТИМАИ2
Это не значит, что разработчик не изменит его на Fixed, а потом получит неожиданные результаты…
Soumya_Gautam
№16
Размер настроен на адаптивный.
Я не изменил его.
HIFI_APPS
# 17
как сказала @dora_paz
сделайте это, а также попробуйте увеличить ширину, это будет гладко
HIFI_APPS
# 18
извините, это может не работать с тем, что я опубликовал, но прочитал
Помощь с рисованием Проблема с шириной линии
Soumya_Gautam
# 19
Привет, HIFI_APPS, я тоже просмотрел этот пост.