Java Affine Transformation рисовать путь - PullRequest
0 голосов
/ 07 ноября 2019

Пример изображения: 1

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

Все работает хорошо, и я могу нарисовать путь, но путь отображается не очень хорошо. Есть много белых пробелов. Я думаю, что это вызвано вращением линий.

Как я могу получить путь без этих белых пробелов?

public class Stage extends JPanel
{

/**
 * 
 */
private static final long serialVersionUID = 1L;

int pW = 2000;
int pH = 2000;

double _x = 400,_y=300;

double centerX, centerY;
double x,y,angle, angleLine, xpic,ypic;
double w = 100;
double x1,y1,x2,y2,x3,y3;
double xCnt = 0;

BufferedImage bi;

private boolean gf_bgSet;

Point2D p1 = new Point2D.Double(0,0);
Point2D p2 = new Point2D.Double(0,0);;
Point2D lastRotP = new Point2D.Double(0,0);

double degrees;

boolean gf_up = false;
boolean gf_down = false;

private double angleOld;

private double ArcAngleOld;


public Stage()
{
    setLayout(null);
    setBounds(0,0,pW,pH);
    setBackground(Color.WHITE);
    centerX = _x;
    centerY = _y;

    x = centerX;
    y = centerY;

    xpic = centerX;
    ypic = centerY;

    bi = new BufferedImage(pW, pH, BufferedImage.TYPE_INT_ARGB);

}






public void moveLine(KeyEvent e)
{

    switch(e.getKeyCode())

    {
    case KeyEvent.VK_PLUS:
    angle--;
    angleLine--;
    degrees++;

    if (degrees == -360 || degrees == 360)
    {
        degrees = 0;
    }

    repaint();
    break;

    case KeyEvent.VK_MINUS:
    angle++;
    angleLine++;
    degrees--;

    if (degrees == -360 || degrees == 360)
    {
        degrees = 0;
    }

    repaint();
    break;

    case KeyEvent.VK_LEFT:
    break;

    case KeyEvent.VK_RIGHT:
    break;

    case KeyEvent.VK_UP:
    gf_down = false;
    gf_up = true;
    xpic++;
    repaint();
    break;

    case KeyEvent.VK_DOWN:
    ypic--;

    gf_down = true;
    gf_up = false;
    repaint();
    break;

    case KeyEvent.VK_Z:
    repaint();
    break;
    }
  }



@Override
public void paintComponent(Graphics g)
{

   super.paintComponent(g);

   double _w = 100;

   //get Graphic2D objects
   Graphics2D g2d = (Graphics2D) bi.createGraphics();
   Graphics2D g2dMain = (Graphics2D) g;     

   //set Background and first blue line
   if (gf_bgSet==false)
   {
    g2d.setColor(Color.WHITE);
    g2d.fillRect(0, 0, pW, pH);

    g2d.setColor(Color.BLUE);

    Line2D line = new Line2D.Double(_x, _y, _x+_w/2,_y);
    g2d.draw(line);

    gf_bgSet=true;

   }
   else
   {

   double _angle = 0;
   _angle = Math.toRadians(degrees);      

   //Set color red transparent
   g2d.setColor(Color.BLUE); 

    //Draw line  
    Line2D line = null;
    line = new Line2D.Double(_x, _y, _x+(_w/2), _y);

  if(gf_up==true)
  {
  _x=_x+(Math.sin(_angle));        
  _y=_y-(Math.cos(_angle));
  }
  else
  {
  _x=_x-(Math.sin(_angle));        
  _y=_y+(Math.cos(_angle));      
  }

  angleOld = _angle;

  double xDiff = centerX-_x;
  double yDiff = centerY-_y;

   AffineTransform old = g2d.getTransform();
   AffineTransform atLine = AffineTransform.getRotateInstance(_angle,_x+w/2,_y);

     g2d.draw(atLine.createTransformedShape(line));

     g2d.setTransform(old);

    //Rotate picture           
   AffineTransform oldtrans = g2dMain.getTransform();
   AffineTransform trans = AffineTransform.getRotateInstance(-_angle, centerX-xDiff, centerY-yDiff); 

   g2dMain.translate(xDiff, yDiff);

   g2dMain.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
   g2dMain.drawImage(bi, trans , null);
   g2dMain.setTransform(oldtrans);        

   } 

}

}

1 Ответ

0 голосов
/ 07 ноября 2019

Вместо того, чтобы рисовать линии одну за другой, попробуйте использовать GeneralPath и установите BasicStroke равным размеру линий, которые вы используете в данный момент. С каждой новой точкой вы просто обновляете свой путь.

Вот хороший пример:

https://kodejava.org/how-do-i-draw-a-generalpath-in-java-2d/

Example GeneralPath

...