我想制作一条简单的楼梯线,每条线的间隔距离为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);
}
答案 0 :(得分: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 );
}
}
免责声明:代码未经编译,未经测试 - 旨在提供提示。
答案 1 :(得分: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
答案 2 :(得分:0)
这可能不是正确的答案,但似乎您可能需要设置一个循环来以阶梯形状绘制线条:
bool vert = false;
while(x_pixel <= x_world){
if (vert){
g.drawLine(x, y);
vert = True;
else{
g.drawLine(y,x);
vert = False;
这不是确切的代码!只是对可能有用的一般概念。
我希望这是有道理的。你只是试图让它先绘制一条垂直线然后再绘制一条水平线,然后重复。而不只是一条长线。