Comment dessiner une ligne d'escalier en utilisant une ligne de dessin en java?


Je veux faire une ligne d'escalier simple ayant une distance d'intervalle de 200 mètres dans chaque ligne. Comme vous pouvez le voir dans le code, il a une hauteur d'écran (y1_world) de 2000 mètres et une largeur d'écran(x1_world) de 1125. Le code ne fonctionne que dans une position inclinée de lignes et non dans un escalier et c'est mon problème.

Quelqu'un pourrait-il me donner une idée à ce sujet?

Voici le code:

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);
   }
Author: papski, 2011-10-10

3 answers

Vous faites trop peu: vous devriez tracer une ligne vers le haut, puis une ligne vers la droite. Si j'étais vous, j'encapsulerais cela dans une fonction "escalier":

 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 );
}

Vous en faites trop aussi: la mise à l'échelle de votre image sur votre fenêtre se trouve être la spécialité de AffineTransform (voici un brève intro)

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 );
    }
 }

Avertissement: le code est non compilé, non testé - destiné à donner un indice.

 2
Author: xtofl, 2011-10-10 09:30:38

Un seul drawLine ne dessine pas d'escalier. Vous devez dessiner deux lignes: Une horizontale et une verticale:

    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
 1
Author: Ingo Kegel, 2011-10-10 08:50:33

Ce n'est peut-être pas la bonne réponse, mais il semble que vous ayez peut-être besoin de configurer une boucle pour tracer les lignes en forme d'étape:

bool vert = false;

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

Ce n'est pas le code exact! Juste une idée générale de ce qui pourrait fonctionner.

J'espère que cela a du sens. Vous essayez simplement de le faire tracer une ligne verticale d'abord, puis une ligne horizontale, puis répétez. Plutôt qu'une seule longue ligne.

 0
Author: RonnyKnoxville, 2011-10-10 08:56:01