2011-10-10 138 views
0

我想在每条线上制作一条间距为200米的简单楼梯线。正如你在代码中看到的那样,它的屏幕高度(y1_world)为2000米,屏幕宽度(x1_world)为1125.该代码只能在斜线位置工作,而不是在楼梯上,这是我的问题。如何在java中使用绘制线绘制楼梯线?

有人能给我一个关于这件事的想法吗?

下面的代码:

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的想法,它有很大的帮助.. – sack

0

这可能不是正确的答案,但它好像你可能需要建立一个循环来画线呈阶梯状:

bool vert = false; 

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

这不是确切的代码!只是一个可能工作的一般概念。

我希望这是有道理的。你只是试图让它先画一条垂直线然后画一条水平线,然后重复。而不仅仅是一条长长的路线。

+0

hm ...一个隐藏的状态机有两个状态?这是不是有点矫枉过正? – xtofl

+0

干杯队友为反对票。鼓励新用户回答问题的好方法。 – JackalopeZero

+0

真的很抱歉,我不喜欢这个答案。不要把它看作个人,你也会从“社区”中获得你的最高票数。事实上,请不要犹豫,以减少你不同意的答案 - 这是我从比我聪明的人那里学习的方式。 – xtofl