【发布时间】:2014-06-04 12:43:55
【问题描述】:
示例:
假设我有一个 512x512 分辨率的画布。我试图得到它的坐标如下:
第一步:将每个画布分成笛卡尔坐标象限
_____ _____ | | | | 2 | 1 | |_____|_____| | | | | 3 | 4 | |_____|_____|第二步:将每个象限划分为另外四个象限,并在旧象限之后添加新的象限ID,如下所示:
_____ _____ _____ _____ | | | | | | 22 | 21 | 12 | 11 | |_____|____|____|____| | | | | | | 23 | 24 | 13 | 14 | |_____|____|____|____| | | | | | | 32 | 31 | 42 | 41 | |_____|____|____|____| | | | | | | 33 | 34 | 43 | 44 | |_____|____|____|____|等等……
_____ _____ _____ _____ _____ _____ _____ _____ | | | | | | | | | | 222 | 221 | 212 | 211 | 122 | 121 | 112 | 111 | |_____|____|_____|____|____|____|____|_____| | | | | | | | | | | 223 | 224 | 213 | 214 | 123 | 124 | 113 | 114 | |_____|____|_____|____|____|____|____|_____| | | | | | | | | | | 232 | 231 | 242 | 241 | 132 | 131 | 142 | 141 | |_____|____|_____|____|____|____|____|_____| | | | | | | | | | | 233 | 234 | 243 | 244 | 133 | 134 | 143 | 144 | |_____|____|_____|____|____|____|____|_____| | | | | | | | | | | 322 | 321 | 312 | 311 | 422 | 421 | 412 | 411 | |_____|____|_____|____|____|____|____|_____| | | | | | | | | | | 323 | 324 | 313 | 314 | 423 | 424 | 413 | 414 | |_____|____|_____|____|____|____|____|_____| | | | | | | | | | | 332 | 331 | 342 | 341 |第432章第431章第442章第441章 |_____|____|_____|____|____|____|____|_____| | | | | | | | | | | 333 |第334章第343章第344章第433章第434章第443章第444章 |_____|____|_____|____|____|____|____|_____|直到象限数等于像素数
我想在这里总结一下如何实现这个功能。
首先,我想到了一个函数,它将获得一个 imageData 索引并返回它的象限 id 。但是这样每次调用函数时我都必须进行一些繁重的(?)计算。
或者从imageData 生成一个新数组,并在需要时通过索引访问它的元素。
我确信有几种方法可以解决这个问题。递归方法很有趣,是否可以在更大的画布上使用?
我的朋友向我指出了以下一段代码,它做了非常相似的事情,但我很难理解这里发生的事情:
for (var y = 0; y < 512; y++)
for (var x = 0; x < 512; x++){
var s = "";
for (var b = 1; b <= 256; b *= 2){
var yb = y & b;
var xb = x & b;
s = String.fromCharCode(49 + (xb != yb) + yb / b * 2) + s;
}
}
我没有得到二进制数学或魔法49 数字?这是 "1" 的字符串。以它为起点是个好主意吗?
【问题讨论】:
-
JavaScript 中的位运算符快速参考:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
-
我建议不要使用该循环,它会循环约 4194304 次并导致我的 chrome 控制台停止响应。
-
我们可以假设 1) 宽度和高度是 2 的幂和/或 2) 宽度 == 高度? (取决于此,这是一个非常简单的解决方案)
-
@GameAlchemist 你是对的!
标签: javascript algorithm math canvas