У меня есть программа, которая позволяет пользователю выбирать размер и рисовать кривую свободной формы, аналогичную функции пера для графической программы. Я использую для этого Path2D
.Как рисовать плавный путь
Я ищу способ сделать нарисованный путь менее зубчатым. Первоначально я использовал path.lineTo
для этой функции, в результате чего левый путь был неровным. Затем я попробовал path.curveTo
, но это создало множество заостренных областей вдоль пути, как показано справа.
Есть ли способ, чтобы сделать кривые гладкие с Path2D
?
import ...
public class Test extends JPanel implements MouseListener, MouseMotionListener {
int count, midX, midY, curveX, curveY;
Point startPoint, stopPoint, releasePoint;
Shape pathShape;
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
if (pathShape != null) {
g2.setStroke(new BasicStroke(50));
g2.draw(pathShape);
}
}
@Override
public void mousePressed(MouseEvent ev) {
count = 1;
startPoint = new Point(ev.getPoint());
Path2D.Double path = new Path2D.Double();
pathShape = path;
repaint();
}
@Override
public void mouseReleased(MouseEvent ev) {
releasePoint = new Point(ev.getPoint());
Path2D path = (Path2D) pathShape;
path.moveTo(releasePoint.x,releasePoint.y);
path.closePath();
pathShape = path;
}
// The mouseDragged method where lineTo is used.
@Override
public void mouseDragged(MouseEvent ev) {
stopPoint = ev.getPoint();
Path2D path = (Path2D) pathShape;
path.moveTo(startPoint.x,startPoint.y);
path.lineTo(stopPoint.x,stopPoint.y);
pathShape = path;
startPoint = stopPoint;
repaint();
}
// The mouseDragged method where curveTo is used.
@Override
public void mouseDragged(MouseEvent ev) {
if (count == 2) {
midX = stopPoint.x;
midY = stopPoint.y;
}
if (count++ >= 3) {
curveX = midX;
curveY = midY;
midX = stopPoint.x;
midY = stopPoint.y;
}
stopPoint = ev.getPoint();
Path2D path = (Path2D) pathShape;
path.moveTo(startPoint.x,startPoint.y);
if (count >= 3)
path.curveTo(curveX,curveY,midX,midY,stopPoint.x,stopPoint.y);
else
path.lineTo(stopPoint.x,stopPoint.y);
pathShape = path;
startPoint = stopPoint;
repaint();
}
}
Рассмотрим обеспечение [работоспособный пример] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer