Java 图形减半机制故障
Java Graphical Halfing Mechanism Malfunction
g.setColor(c);
double changeFactor = (2<<count);
g.fillRect(x+1, y+1+(int)(boxHeight*(double)(1/changeFactor)), boxWidth-2, boxHeight-2-(int)(boxHeight*(double)(1/changeFactor)));
count++;
if(count == iterations)
{
count = 0;
}
以上是我一直在尝试制作的图形减半机制的代码。简而言之,它的想法是一个简单的图形练习,从一个填充的条开始,每 250 毫秒从当前高度减去一半高度。这样一来,就是身高呈指数级下降。这是当前输出:
Link for those of you who are having trouble viewing the image
这与我想要的输出完全相反。栏中的白色区域是我希望 红色区域执行的翻转图像。你们能帮我弄清楚为什么代码运行不正常吗?
顺便问一下新手问题。
编辑:
这是答案:
g.fillRect(x+1, y+1+(int)(boxHeight*(double)((changeFactor-1)/changeFactor)), boxWidth-2, boxHeight-2-(int)(boxHeight*(double)((changeFactor-1)/changeFactor)));
长话短说,这是因为我错误计算了我希望 height/y-coordinate 的分子。
根据fillRect
definition,第二个参数是盒子顶部的位置。 (在计算机图形学中,沿着 Y 轴向下,数字通常会变大,这与数学家绘制图形的方式相反。)假设您希望柱形的 top 保持前进向下(与条形底部向上相反),这意味着第二个参数需要不断变大。但是,在您的代码中,参数不断变小,因为 1/count
不断变小。
如果 h
是总高度,y
是框的顶部,那么您希望此参数的连续值是:
y
y + h/2
y + h/2 + h/4
y + h/2 + h/4 + h/8 ...
或者,换句话说:
y + h - h
y + h - h/2
y + h - h/4
y + h - h/8
基于此,我想您可以了解如何对代码进行一些小的修改并使其正常工作。
此外,请确保在迭代之间清除该框。 fillRect
不会触及您正在绘制的矩形之外的任何东西。所以如果你想让填充的部分变小,你必须做一些事情来清除你不想再着色的以前着色的部分。
g.setColor(c);
double changeFactor = (2<<count);
g.fillRect(x+1, y+1+(int)(boxHeight*(double)(1/changeFactor)), boxWidth-2, boxHeight-2-(int)(boxHeight*(double)(1/changeFactor)));
count++;
if(count == iterations)
{
count = 0;
}
以上是我一直在尝试制作的图形减半机制的代码。简而言之,它的想法是一个简单的图形练习,从一个填充的条开始,每 250 毫秒从当前高度减去一半高度。这样一来,就是身高呈指数级下降。这是当前输出:
Link for those of you who are having trouble viewing the image
这与我想要的输出完全相反。栏中的白色区域是我希望 红色区域执行的翻转图像。你们能帮我弄清楚为什么代码运行不正常吗?
顺便问一下新手问题。
编辑: 这是答案:
g.fillRect(x+1, y+1+(int)(boxHeight*(double)((changeFactor-1)/changeFactor)), boxWidth-2, boxHeight-2-(int)(boxHeight*(double)((changeFactor-1)/changeFactor)));
长话短说,这是因为我错误计算了我希望 height/y-coordinate 的分子。
根据fillRect
definition,第二个参数是盒子顶部的位置。 (在计算机图形学中,沿着 Y 轴向下,数字通常会变大,这与数学家绘制图形的方式相反。)假设您希望柱形的 top 保持前进向下(与条形底部向上相反),这意味着第二个参数需要不断变大。但是,在您的代码中,参数不断变小,因为 1/count
不断变小。
如果 h
是总高度,y
是框的顶部,那么您希望此参数的连续值是:
y
y + h/2
y + h/2 + h/4
y + h/2 + h/4 + h/8 ...
或者,换句话说:
y + h - h
y + h - h/2
y + h - h/4
y + h - h/8
基于此,我想您可以了解如何对代码进行一些小的修改并使其正常工作。
此外,请确保在迭代之间清除该框。 fillRect
不会触及您正在绘制的矩形之外的任何东西。所以如果你想让填充的部分变小,你必须做一些事情来清除你不想再着色的以前着色的部分。