Как нарисовать линию лестницы, используя Drawline в Java? - PullRequest
0 голосов
/ 10 октября 2011

Я хочу сделать простую линию лестницы с интервалом 200 метров в каждой линии. Как вы можете видеть из кода, он имеет высоту экрана (y1_world) 2000 метров и ширину экрана (x1_world) 1125. Код работает только в наклонном положении линий, а не на лестнице, и это моя проблема.

Может ли кто-нибудь дать мне представление об этом?

Вот код:

public void paint(Graphics g)
{
    super.paint(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setBackground(Color.white);

    int x0_pixel = 0;
    int y0_pixel = 0;

    int x1_pixel = getWidth();
    int y1_pixel = getHeight();

    int x0_world = 0;
    int y0_world = 0;

    int x1_world = 2000; // meters
    int y1_world = 1125; // meters

    double x_ratio = (double) x1_pixel / x1_world;
    double y_ratio = (double) y1_pixel / y1_world;

    double len = x1_world; // meters

    double interval = 200; // meters


    int x_world = 0;
    int y_world = 0;

    while (((y_world += interval) <= y1_world) && ((x_world +=interval) <= x1_world))
    {
        int x_pixel = convertToPixelX(x_world, x_ratio);
        int y_pixel = convertToPixelY(y_world, y_ratio);

        g2d.setColor(Color.BLUE);
        g2d.drawLine(x_world, y_world, x_pixel, y_pixel);


    }

    Toolkit.getDefaultToolkit().sync();
    g2d.dispose();
}

private static int convertToPixelY(int y_world, double y_ratio)
   {
       return (int) (y_world * y_ratio);
   }

   private static int convertToPixelX(int x_world, double ratio)
   {
       return (int) (x_world * ratio);
   }

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Вы делаете слишком мало : вы должны нарисовать линию вверх, а затем линию вправо. На вашем месте я бы заключил это в функцию «лестницы»:

 public void step( Graphics2d g ) {
    Point midPoint = getMidPoint();
    Point endPoint = getEndPoint();
    drawStep( g, currentPoint, midPoint, endPoint );
    currentPoint = endPoint;
 }

public void drawStep( Graphics2d g, Point first, Point mid, Point last ) {
   g.drawLine( first.x, first.y, mid.x, mid.y );
   g.drawLine( mid.x, mid.y, last.x, last.y );
}

public Point getMidPoint(){
   return new Point( currentPoint.x, currentPoint.y + stepHeight );
}

public Point getEndPoint(){
   return new Point( currentPoint.x + stepWidth, currentPoint.y + stepHeight );
}

Вы слишком много делаете тоже: масштабирование вашего изображения в окне просмотра является специальностью AffineTransform (вот краткое введение )

public void paint( Graphics gx ) {
    Graphics2D g = (Graphics2D) gx;

    AffineTransform scale = AffineTransform.getScaleInstance(
           xPixels/numberOfSteps*stepWidth, 
           yPixels/numberOfSteps*stepHeigth );
    g.transform(scale);
    for( int i = 0; i < numberOfSteps; ++ i ) {
        step( g );
    }
 }

Отказ от ответственности: код не скомпилирован, не проверен - предназначен для подсказки.

1 голос
/ 10 октября 2011

Один drawLine не рисует лестницу. Вы должны нарисовать две линии: горизонтальную и вертикальную:

    g2d.drawLine(x_world, y_world, x_pixel, y_world); // keep y constant
    g2d.drawLine(x_pixel, y_world, x_pixel, y_pixel); // keep x constant
0 голосов
/ 10 октября 2011

Возможно, это неправильный ответ, но, возможно, вам понадобится настроить цикл для рисования линий в форме шага:

bool vert = false;

while(x_pixel <= x_world){
     if (vert){
         g.drawLine(x, y);
         vert = True;
     else{
         g.drawLine(y,x);
         vert = False;

Это не точный код!Просто общее представление о том, что может сработать.

Надеюсь, это имеет смысл.Вы просто пытаетесь заставить его сначала нарисовать вертикальную линию, затем горизонтальную, а затем повторить.Вместо одной длинной линии.

...