2016-04-28 2 views
1

это будет долго, поэтому заранее спасибо для чтения и/или отвечать :)Рисование в Java 2D с быстрым mousemovement

Edit: Это How to draw a continuous curve of repeated ovals on speedy mouse cursor dragging? имеет ответ я не совсем хорошо с, не существует никакой другой способ сделать это, чем рисовать прямые линии между прямоугольниками или овалами? (для меня это не имеет значения, если прямоугольник или овал).

Я много искал и не нашел то, что искал, так что вот мы идем: Мне нужно создать приложение для рисования для университета, и я практически закончен, моя проблема, тем не менее, что событие mouseDragged похоже, недостаточно быстро распознает движение (?). Это означает, что если пользователь чертит руки кистью и слишком быстро перемещает мышь, программа не будет рисовать «сплошную линию прямоугольников». Вместо этого на чертеже будет много пробелов. Это как моя краска() переопределение и MouseMotionListener (для currentTool 1, который, как предполагается, приравнять кисть/перо) выглядит следующим образом:

public void paint(Graphics g){ 

    g2d = (Graphics2D)g; 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
    g2d.setComposite(AlphaComposite.getInstance(
      AlphaComposite.SRC_OVER, 1.0f)); 
    Iterator<Color> sc = strokeColours.iterator(); 
    Iterator<Color> fc = fillColours.iterator(); 
    Iterator<Boolean> fill = fillq.iterator(); 

    for (Shape s : shapes){ 
     g2d.setStroke(new BasicStroke(4)); 
     g2d.setPaint(sc.next()); 
     g2d.draw(s); 
     g2d.setPaint(fc.next()); 
     if (fill.next()){ 
      g2d.fill(s);  
     } 
    } 
    if (temp!=null){ 
     g2d.setComposite(AlphaComposite.getInstance(
       AlphaComposite.SRC_OVER, 0.5f)); 
     g2d.setPaint(strokeColour); 
     g2d.draw(temp); 
     if(isfilled){ 
      g2d.setPaint(fillColour); 
      g2d.fill(temp); 
     } 
    } 
} 

motionlistener:

this.addMouseMotionListener(new MouseMotionAdapter(){ 
     public void mouseDragged(MouseEvent e){ 
      mx2=e.getX(); 
      my2=e.getY(); 
      if (currentTool==1){   
       Shape point= new Rectangle2D.Double(mx2-(0.5*penStroke),my2-(0.5*penStroke),0.5+penStroke,0.5+penStroke); 
       shapes.add(point); 
       addColours(strokeColour); 
      } 

      else if(...){... 
      } 


      repaint();    
     } 
    }); 
} 

NB: addColours (цвет c) funtion определяется вручную, чтобы добавить strokeColour как в strokeColours, так и в fillColours, а также добавить «true» для fillq. penStroke определяется с помощью ползунка и используется только для этого «инструмента».

+0

Вы можете сохранить информацию о «точках» и просто перебрать рисунок объектов между ними, теперь вам нужно будет выбрать уровень итерации – MadProgrammer

ответ

1

Посмотрите на Shape, некоторые из классов детей будут выполнять кривые Безье и т. Д. Попробуйте CubicCurve2D.Float, QuadCurve2D.Double или такой, для последних обнаруженных точек мыши. Обратите внимание, что не все «контрольные» точки кривых лежат на самой кривой, но без (много) математики можно получить хорошие результаты.

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