我正在尝试做一些复杂的效果,为了做到这一点,我必须把它分解成它的组件,我可以继续构建,希望它们会聚集在一起 .
现在在画布上制作一个圆圈很容易 . 但我想自己做 . 所以我想编写一个函数,给出一个中心点,半径,然后它将绘制一个1 px笔画宽度的圆 .
我该怎么办呢?如果我从数学角度来看,我想到的是使用圆距离公式并按小值增加,如.3度,并在圆周上做一个点 . 但是如果我的圆圈太小,比如2 px半径 . 然后它将浪费大量时间绘制无关紧要,如果它足够大,你会看到点之间的空格 .
所以我想要我的圆绘图功能来绘制一个
-
dot如果半径是1px .
如果半径为2px,则中心周围有4个点 . -
..等等 .
-
如果这会让我的圆圈看起来很僵硬,我也希望它也能抗锯齿:D
我想,一旦我知道如何使轮廓填充它将不会是一个问题 . 我所要做的就是缩小半径并保持绘图直到半径为1px .
2 回答
好吧,我把我早期的代码重新考虑为一个名为“canvasLens”的jQuery插件 . 它接受一系列选项来控制图像src,镜头大小和边框颜色等内容 . 您甚至可以选择两种不同的镜头效果,“fisheye”或“scaledSquare” .
我试图通过 Headers 块和大量其他注释使其尽可能不言自明 .
这是一个 Demo .
Edit
这是尝试解释鱼眼(桶形失真)计算......
从
w x h
像素的空白镜头开始 .代码遍历所有像素(目标像素) .
对于每个目标像素,从背景图像中选择一个像素(源像素) .
源像素总是从与目标相同的径向光线上(或接近)的像素中选择,但是距离镜头中心的径向距离较小(使用桶形失真公式) .
这是通过计算源像素的极坐标
(nr, theta)
来机械化的,然后应用程序将标准数学公式转换为矩形坐标nxn = nr * Math.cos(theta)
和nxn = nr * Math.sin(theta)
. 到目前为止,所有计算都是在标准化的-1 ... 0 ... 1空间中进行的 .块中的其余代码重新定义(重新定位),(我必须大量调整的位)实际上通过索引到1维源和目标数据来实现源到目标像素映射 .
您的中心
x0, y0
和半径r
. 基本上你需要圆的参数方程:x = x0 + r * cos(t) y = y0 + r * sin(t)
其中
t
是径向段和标准化x轴之间的角度,您需要根据需要将其分开 . 例如你的四点情况360/4 = 90
因此使用0,90,180,270来获得四个点 .