![]() |
1
1
我可以建议两种方法来解决你的问题。第一种方法是使用ctx.createImageData(w,h)创建包含位图数组(imageData.data,它是一个uint8clampedary)的imageData对象,一旦操作完数据,就可以使用ctx.putImageData(imageData,0,0)将其放在画布上。 或者可以使用webgl提供的解决方案为您绘制线条。(如果要禁用平滑以获取像素化线,则只需在禁用抗锯齿的情况下创建GL上下文即可)。 使用webgl更为可取,因为目前用js编写的任何解决方案实际上一次只能在一个像素上操作(具有共享数组缓冲区的web工作者可以为您提供并发多线程js,但今年年初在所有浏览器中都禁用了它)。 下面是一个由webgl驱动的模块,可以用来快速绘制不同厚度和颜色的线条。 (为了测试速度,下面的代码片段绘制了10000行)。
|
![]() |
2
0
Fast Bresenham的HTML5画布系列。解决方案
如果减少路径调用的数量,则可以改进渲染。例如少打电话给
一个1像素长的矩形和20像素长的矩形在渲染时间上的差异太小,我无法测量。所以减少通话次数会有很大的改善。
看一条从1,1到15,5的线路需要打10个电话
但它只能用3个像素宽的矩形进行5次调用。
标准算法要求最大坐标长度加上一个路径调用。例1,1至15,5为
新算法
使用与bresenham线相同的误差方法,并以八度角工作,可从累积误差值计算到下一y步(八度角0)或x步(八度角1)的距离。这段距离使
水平线和垂直线在单个路径调用中呈现。45度的行需要最多的路径调用,但由于这是一种特殊情况,因此该函数可以获得javascript性能优势。 对于随机选择的行,它应该将draw调用的数量减少到42%
|
![]() |
3
0
既然你在做像素艺术,为什么不在像素级:直接操作图像数据。 你说你的画布很可能会被污染,它会设置过滤器和GCO。这些都不重要。
使用第二个屏幕外画布,只生成像素艺术渲染。
将其大小设置为渲染像素网格之一(即originalcanvassize/pixelsize)。
希望应用于路径图形的过滤器和GCO也将应用于此最终版本
我相信你可以用更干净的方式重写它,但这里有一个粗略的概念证明:
|
![]() |
mikanim · 改进二维余弦函数的numpy功能 2 年前 |
![]() |
chutiya · 我被python中的变量困住了 3 年前 |
![]() |
Mark Yo · 从成绩转换为gpa(带小数)[重复] 7 年前 |
![]() |
Nick X Tsui · 2D插值导致溢出错误:要插值的数据点太多 7 年前 |
![]() |
Gentem · 如何读取文本文件图像并将其保存到数组? 7 年前 |
![]() |
AL BAHRI · 循环通过2D阵列(对角线)c++ 7 年前 |