我有一个我一直在研究的绘画程序,并且我已经开始解决不透明度问题。我现在将背景颜色与画笔颜色进行比较,根据它们的 alpha 对两者进行平均,然后设置一个新像素。我只需要将我正在绘制的部分缓存到一边,这样它就不会在鼠标按下时连续采样不断变化的内容。我想我可以通过将 50 个像素扔到一个堆栈或队列中来解决这个问题,一旦它满了就开始改变屏幕上的像素,并在鼠标抬起时将所有内容完全清空到屏幕上。我想知道什么会更有效,两个堆栈(一个坐标和一个颜色)或一堆我解析为坐标和颜色的字符串。TLDR:更有效率的是,两个不同数据类型的堆栈,
问问题
25 次
1 回答
0
您的问题似乎比需要的更长,更令人困惑,但我认为您要问的是:
我正在设计一个绘画程序。如果用户在白色背景上绘制 50% 不透明的黑色像素,我希望它们显示为灰色。我的问题是,如果用户绘制一条与自身相交的曲线,或者只是将鼠标光标留在同一位置一段时间,重复的像素会变得越来越暗:50% 黑色,然后是 75%,然后是 87.5%...我不想要这个。只要按下鼠标按钮,任何像素都不应被“绘制”两次,无论曲线与自身相交多少次。
这个问题自己回答。防止像素被绘制两次的唯一方法是跟踪自上次鼠标按钮打开以来已绘制了哪些像素。代替
image[mouse.x][mouse.y] = alpha_average(image[mouse.x][mouse.y], current_color, current_alpha);
和
if (not already_painted[mouse.x][mouse.y]) {
image[mouse.x][mouse.y] = alpha_average(image[mouse.x][mouse.y], current_color, current_alpha);
already_painted[mouse.x][mouse.y] = true;
}
handle(mouse_up) {
already_painted[*][*] = false;
}
问题解决了,对吧?
但是要回答另一个隐含的问题:如果您试图在一堆并行数组和一堆填充到 strings 中的数据之间进行选择,那么您可能做错了。所有 Unity3D 语言(Python、C#、Javascript)都支持 struct/class/dict 类型和元组,其中任何一个都比并行数组或一切都是字符串主义更好。
于 2012-09-02T19:15:28.923 回答