Пример изображения: 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);
}
}
}