D3.js 在p5.js中,清除draw()中的元素,这些元素会更改每一帧,但会保留在setup()中创建的昂贵元素(贴图)
使用p5.js和d3.js进行映射,我在画布上的D3.js 在p5.js中,清除draw()中的元素,这些元素会更改每一帧,但会保留在setup()中创建的昂贵元素(贴图),d3.js,processing,p5.js,D3.js,Processing,P5.js,使用p5.js和d3.js进行映射,我在画布上的setup()中加载了特定县的美国地图。由于shapefile相当大,因此加载大约需要1/2-1秒 在draw()中,我正在创建一些文本、省略号等,我想使用滑块更新这些文本、省略号等,并且可能会创建一些额外的动画 通常在p5.js中,您只需在draw()之后使用background(255)即可擦除所有内容,并使过渡平滑,以便没有重叠、旧的省略号和文本被擦除干净,等等 我遇到的问题是,我的初始贴图加载成本太高,我无法擦除它并在每一帧重新绘制,它落后
setup()
中加载了特定县的美国地图。由于shapefile相当大,因此加载大约需要1/2-1秒
在draw()
中,我正在创建一些文本、省略号等,我想使用滑块更新这些文本、省略号等,并且可能会创建一些额外的动画
通常在p5.js中,您只需在draw()
之后使用background(255)
即可擦除所有内容,并使过渡平滑,以便没有重叠、旧的省略号和文本被擦除干净,等等
我遇到的问题是,我的初始贴图加载成本太高,我无法擦除它并在每一帧重新绘制,它落后于所有帧。我需要绘制一次贴图,然后在除贴图之外的所有其他元素上创建背景(255),或者在画布上保留在setup()中创建的贴图时,基本上清除在draw()中每帧创建的所有内容。或者只需清除地图以外的所有元素。
下面是我在p5编辑器中编写的假设代码。背景中的矩形是地图的占位符。您可以看到,因为文本和省略号没有被删除,所以它们会重叠,一旦省略号达到一定的大小,您就无法减小它们的大小,因为大的省略号仍然存在
下面是一个使用background()
的示例,这使得p5.js代码非常理想和干净,但是在安装程序中创建的rect(即映射)显然被删除并消失
有没有一种方法可以在画布上保留一个元素,同时覆盖所有其他元素,比如在概念上使用背景、清除或其他一些我显然不太了解的方法?谢谢你的任何想法和帮助
下面是一个屏幕截图,您可以看到我正在绘制的地图,基本上与占位符rect相同,并尝试使用滑块更改椭圆。
您有两个选择:
- 如果贴图始终相同,则可以将其保存到图像文件中。将其加载到
函数中的变量中,然后在setup()
函数中绘制它draw()
- 如果映射可能在程序运行之间发生变化,则可以在
中将映射绘制到缓冲区,然后在setup()
中绘制该缓冲区。draw()
函数将在这里派上用场createGraphics()
var pg;
function setup() {
createCanvas(100, 100);
pg = createGraphics(100, 100);
pg.background(100);
pg.noStroke();
pg.ellipse(pg.width / 2, pg.height / 2, 50, 50);
}
function draw() {
background(200);
image(pg, 50, 50);
image(pg, 0, 0, 50, 50);
}
你怎么画这个背景呢?如果将其加载到
设置
中的图像
变量中,则在绘图
中可能会显示得更快。如果背景图像与画布大小相同,则无需在绘图()中清除背景,只需图像(pg,0,0)代码>是enough@rioV8这将取决于上下文。例如,如果背景图像包含透明度,则可能仍希望清除旧帧。还请注意,您可以将图像直接传递到background()
函数中。但同样,这一切都取决于上下文。我的回答只是一个一般性的例子,而不是针对所有情况。你用纯色清除pg背景,所以没有transparencies@rioV8是的,在这个特殊的例子中。但这完全取决于上下文。@KevinWorkman和riov8非常感谢您的回答和帮助!我认为这两种选择都可以。为了在2秒钟内添加上下文,我基本上使用这个示例作为起点,并在setup()中使用d3.json()加载映射。地图将是静态的。我试着用谷歌搜索缓冲区,看到了这个链接。凯文,对不起,我是自学成才的人,不是计算机科学知识的圣地,你有解释屏幕外缓冲区的参考资料吗?试着想想你的两个REC之间的权衡。