javascript - P5 尝试分解图形和画布代码
问题描述
我想分解代码以在图形或标准画布中绘制相同的东西。
(在我的真实程序中,我希望在构建时给出的某些上下文中绘制自己的自治类)
我无法从画布中找到一些可以匹配除线条之外的图形指令的等价物。
在下文中,我尝试将画布或图形对象赋予绘图方法someDraw,但画布上只出现线条,而整个绘图出现在图形中。
let canvas;
let myGraph;
function setup() {
canvas = createCanvas(200,300,WEBGL);
canvas.parent('sketch-div');
myGraph = createGraphics(200,300,WEBGL);
stroke('red');
noFill();
noLoop();
}
function draw(){
// direct draw on canvas / doesn't work correctly
someDraw(canvas);
// indirect draw on graphics, then show image
someDraw(myGraph);
// show result
image(myGraph,100,100);
}
function someDraw(pg){
pg.clear();
pg.background(color(0,0,200));
// as webgl set 0,0 upper left
pg.translate(-pg.width/2, -pg.height/2);
pg.stroke('red');
pg.line(0,0,100,50);
pg.rect(0,0,60,60);
pg.ellipse (25,50,50,100);
}
您可以看到画布中绘制的(红色)线,但看不到矩形或椭圆。图形是正确的。
另一个效果:如果这个小程序循环(参见设置中的 noLoop() ),图形第一次出现转瞬即逝,然后不再显示。
所以,画布和图形不在同一个层次结构中,但是有没有一种通用的方法可以在不复制所有代码的情况下在两者上绘制?
解决方案
使用实例化:
var sketch = function( p ) {
let canvas;
let myGraph;
p.setup = function() {
canvas = p.createCanvas(200,300, p.WEBGL);
canvas.parent('sketch-div');
myGraph = p.createGraphics(200,300,p.WEBGL);
p.noLoop();
}
p.draw = function(){
// [...]
}
}
var test_3d = new p5(sketch);
将 p5 实例传递给someDraw
someDraw(p);
或 p5.Renderer 对象:
someDraw(myGraph);
完整示例:
var sketch = function( p ) {
let canvas;
let myGraph;
p.setup = function() {
canvas = p.createCanvas(200,300,p.WEBGL);
canvas.parent('sketch-div');
myGraph = p.createGraphics(200,300,p.WEBGL);
p.noLoop();
}
p.draw = function(){
// direct draw on canvas / doesn't work correctly
someDraw(p);
// indirect draw on graphics, then show image
someDraw(myGraph);
// show result
p.image(myGraph,100,100);
}
function someDraw(pg){
pg.clear();
pg.background(pg.color(0,0,200));
// as webgl set 0,0 upper left
pg.translate(-pg.width/2, -pg.height/2);
pg.stroke('red');
pg.noFill();
pg.line(0,0,100,50);
pg.rect(0,0,60,60);
pg.ellipse (25,50,50,100);
}
}
var test_3d = new p5(sketch);
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.0.0/p5.min.js"></script>
<div id="sketch-div"></div>
推荐阅读
- javascript - three.js — 如何在加载器之外选择网格?
- r - 如何按组根据列值创建“块”?
- javafx - JavaFX 12 中的 WebConsoleListener IllegalAccessError
- python - 是什么阻止我的异步代码运行异步?
- icalendar - 无法通过 MailKit 发送带有图像附件的 iCal.net
- sql-server - 使用 SELECT 结果作为列名
- authentication - 如何在 ajax 中设置 document.cookie?
- python - 查找 docker 镜像的依赖项
- c++ - 如果构建是源外的,CMake 无法确定标头依赖项?
- ruby-on-rails - 如何从 Rails 数据库中获取最后的对话