2015-03-30 3 views
1

У меня есть программа, которая позволяет пользователю выбирать размер и рисовать кривую свободной формы, аналогичную функции пера для графической программы. Я использую для этого Path2D.Как рисовать плавный путь

Я ищу способ сделать нарисованный путь менее зубчатым. Первоначально я использовал path.lineTo для этой функции, в результате чего левый путь был неровным. Затем я попробовал path.curveTo, но это создало множество заостренных областей вдоль пути, как показано справа.

jagged pathjagged and pointed path

Есть ли способ, чтобы сделать кривые гладкие с 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(); 
    } 
} 
+0

Рассмотрим обеспечение [работоспособный пример] (https://stackoverflow.com/help/mcve), который демонстрирует вашу проблему. Это не дамп кода, а пример того, что вы делаете, что подчеркивает проблему, с которой вы сталкиваетесь. Это приведет к меньшему путанице и лучшим ответам – MadProgrammer

ответ

3

Попробуйте использовать

g2.setStroke(new BasicStroke(50, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); 

вместо g2.setStroke(new BasicStroke(50));

+0

Спасибо. Я продолжал думать, что это связано с путём, а не с ударом объекта Grapics2D. – TNT

+0

Кстати ... Я понимаю, что SO не является дампом кода - я видел комментарии, высказывающие так много раз. Я стараюсь сделать мой пример минимальным, полным и поддающимся проверке. Что не так с этим? Конечно, он немного длинный, но он завершен, я включил части программы, которые демонстрируют проблему (без какого-либо другого ненужного кода), и она отлично работает без каких-либо ошибок. Можете ли вы представить свои отзывы, чтобы я мог улучшить будущие вопросы? – TNT

+0

Он не будет компилироваться или запускаться, ему не хватает логики расширения для 'MouseListener', не имеет метода' main' ... это не «полный» или «проверяемый»: P - Который оставил меня до " угадать "по проблеме – MadProgrammer

Смежные вопросы