2011-10-10 18 views
0

私は、すべての行に200メートルの間隔距離を持つ単純な階段線を作りたいと思います。コードで見ることができるように、画面の高さ(y1_world)は2000メートル、画面の幅(x1_world)は1125です。このコードは階段にはなく直線の傾斜した位置でしか機能しません。Javaでdrawlineを使用して階段線を描くにはどうすればよいですか?

誰かが私にこの問題について考えてもらえますか?

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

答えて

2

あまりにも小さい:行を上にしてから、右に線を引く必要があります。私があなただったら、私は「階段」関数でそれをカプセル化します:あなたはあまりにも多くのを

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の専門であることを起こる、ここですbrief 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); 
    } 
} 

免責事項:コードがテストされていない、未コンパイルである - ヒントを与えることを意図。

+0

このヒントのためのtnx ..私はすでにそれを持って..!それは今働く.. – sack

+0

良いヒントのための+15 .. ;-) – sack

1

単一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

アイデアTNX、それは、2つの状態でたくさん.. – sack

0

水平方向と垂直方向の1:次の2本の線を描画する必要が
bool vert = false; 

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

これは、正確なコードではありません!何がうまくいくかの一般的な考え。

これは意味があると思います。あなたは最初に垂直線を描画してから水平線を描き、それを繰り返すだけです。 1つの長い行ではなく。

+0

HM ...隠されたステートマシンに役立ちますか?それはちょっと残忍ではないですか? – xtofl

+0

賛成投票で歓声をあげる。新規ユーザーの質問への回答を促す良い方法です。 – JackalopeZero

+0

本当に申し訳ありませんが、私はこの答えが嫌いでした。それを個人的に取ってはいけません。また、あなたは「コミュニティ」からの投票のあなたのシェアを得るでしょう。実際、私が賢明な人から学ぶ方法は、あなたが反対している回答を淡々と捨てることを躊躇しないでください。 – xtofl

関連する問題