过去我对 acm 图形库做了很多工作,我刚刚开始研究斯坦福分配的突破性问题。我过去多次遇到图形的问题之一是坐标不能准确地反映形状实际出现的位置,尽管我已经对它们进行了两次和三次检查。最后,对于那些作业,我最终对它进行了观察并进行了修改,直到它看起来有点正确。很明显我在这里遗漏了一些东西,因为一个简单的图形程序不应该这么困难。
例如,使用 acm.graphics 我的代码如下所示。
public static final int APPLICATION_WIDTH = 400;
public static final int APPLICATION_HEIGHT = 600;
public void setupBorder(){
// **Sets Black Background
GRect b = new GRect(0,0,400,600); //** Sets Black Background
fillObj(b,Color.black);
add(b);
//**Sets White Square so border is 5 pixels wide on each side
b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10);
fillObj(b,Color.white);
add(b);
}
所以我在这里的想法是,它向右移动了 5 个像素,向下移动了 5 个像素,我需要减去这些,然后再减去一个额外的 5 个像素,以便在每边有一个边框 5 个像素(基本 2b+x = 1 边,2a+y= 垂直边)。您会认为这会在每边创建一个 5 像素的黑色边框,中间有一个白色方块,但事实并非如此。它在窗口的左侧、右侧和顶部创建边框,但不在底部创建边框。那么,这么简单的事情,可能会出什么问题呢?我在纸上检查了两倍、三倍甚至四倍的计算,它应该是中间的一个白色方块,有一个 5 像素的黑色边框,但事实并非如此。我试过改变像素的百分比,效果更差。手动编辑该框,直到 Yvalue 看起来接近 -35,尽管这有点太远了。有人知道出了什么问题吗?
对运行和类中的其他方法所做的这些更改进行了突破。
public void run() {
/* You fill this in, along with any subsidiary methods */
init();
}
public void init(){
setupBorder();
}
public void setupBorder(){
//**Black Background
GRect b = new GRect(0,0,400,600); //**Black Background
fillObj(b,Color.black);
add(b);
b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10);
fillObj(b,Color.white);
add(b);
}
public void fillObj(GFillable a, Color argC)
{
a.setFillColor(argC);
a.setFilled(true);
}