我将如何添加滑块来增加多边形的边,并在不刷新页面的情况下绘制更多多边形?
How would I add sliders to increase the sides of my Polygons, and draw more of them without refreshing the page?
目前我正在绘制顶点以创建多边形,我想添加滑块以允许用户增加或减少多边形的边数和绘制的数量。还有 canvas 刷新更新。
我试过添加一个滑块来控制 noOfSides,但我没有成功。
感谢您的时间和帮助。
let noOfShapes = 3;
let noOfSides;
let rx, ry, drx, dry, rd1, rd2, drd1, drd2;
let threshold = 1000;
let fillColour;
let strokeThick;
let sidesSlider;
function setup() {
createCanvas(1240, 1754);
noLoop();
// background(0, 230)
colorMode(RGB)
rectMode(CENTER);
strokeWeight(3);
//noOfSides = 3;
fillColour = random(0, 255);
sidesSlider = createSlider(4, 12, 3);
sidesSlider.position(width + 20, 0);
sidesSlider.style('width', '150px');
}
function draw() {
background(0, 230)
noOfSides = sidesSlider.value();
for (let x = 0; x < noOfShapes; x++) {
do {
rx = [];
ry = [];
rd1 = [];
rd2 = [];
for (let y = 0; y < noOfSides; y++) {
rx.push(random(10, width - 20));
ry.push(random(10, height - 20));
rd1.push(rx[y] * 1 + ry[y] * 1);
rd2.push(rx[y] * 1 - ry[y] * 1);
}
drx = max(rx) - min(rx);
dry = max(ry) - min(ry);
drd1 = max(rd1) - min(rd1);
drd2 = max(rd2) - min(rd2);
}
while (drx < threshold || dry < threshold || drd1 < threshold || drd2 < threshold)
beginShape();
stroke(255);
fill(random(1, 255), random(1, 255), random(1, 255), 150);
for (let y = 0; y < rx.length; y++) {
vertex(rx[y], ry[y]);
}
endShape(CLOSE);
}
for (let x = 20; x <= width; x = x + 20) {
blendMode(DODGE);
stroke(255);
beginShape();
vertex(x, 0)
vertex(x, height + 20)
endShape();
}
}
首先,由于您正在使用 noLoop()
,因此每当滑块发生变化时,您都需要重新绘制形状。
为此,您可以轻松地定义一个 on change 事件,如下所示:
sidesSlider.input(sliderChange);
我建议您在该函数中分配 noOfSides
变量的值。之后再次调用 draw
函数。
function sliderChange() {
noOfSides = sidesSlider.value();
draw();
}
由于您要在 draw
函数中删除对 noOfSides
的赋值,因此您需要在初始化时或在 `setup 函数中为该变量设置默认值。
...
noOfSides = 3;
...
那么你几乎可以开始了,我唯一不太明白的是你的代码的最后一部分。我删除了那部分,现在它按预期工作。
请注意,您正在使用 alpha
值设置背景颜色。这导致:在每次渲染形状时,最新的形状轮廓仍然几乎看不到。
这是您的代码的最新版本:
https://editor.p5js.org/darcane/sketches/5wpp6UgXI
目前我正在绘制顶点以创建多边形,我想添加滑块以允许用户增加或减少多边形的边数和绘制的数量。还有 canvas 刷新更新。 我试过添加一个滑块来控制 noOfSides,但我没有成功。 感谢您的时间和帮助。
let noOfShapes = 3;
let noOfSides;
let rx, ry, drx, dry, rd1, rd2, drd1, drd2;
let threshold = 1000;
let fillColour;
let strokeThick;
let sidesSlider;
function setup() {
createCanvas(1240, 1754);
noLoop();
// background(0, 230)
colorMode(RGB)
rectMode(CENTER);
strokeWeight(3);
//noOfSides = 3;
fillColour = random(0, 255);
sidesSlider = createSlider(4, 12, 3);
sidesSlider.position(width + 20, 0);
sidesSlider.style('width', '150px');
}
function draw() {
background(0, 230)
noOfSides = sidesSlider.value();
for (let x = 0; x < noOfShapes; x++) {
do {
rx = [];
ry = [];
rd1 = [];
rd2 = [];
for (let y = 0; y < noOfSides; y++) {
rx.push(random(10, width - 20));
ry.push(random(10, height - 20));
rd1.push(rx[y] * 1 + ry[y] * 1);
rd2.push(rx[y] * 1 - ry[y] * 1);
}
drx = max(rx) - min(rx);
dry = max(ry) - min(ry);
drd1 = max(rd1) - min(rd1);
drd2 = max(rd2) - min(rd2);
}
while (drx < threshold || dry < threshold || drd1 < threshold || drd2 < threshold)
beginShape();
stroke(255);
fill(random(1, 255), random(1, 255), random(1, 255), 150);
for (let y = 0; y < rx.length; y++) {
vertex(rx[y], ry[y]);
}
endShape(CLOSE);
}
for (let x = 20; x <= width; x = x + 20) {
blendMode(DODGE);
stroke(255);
beginShape();
vertex(x, 0)
vertex(x, height + 20)
endShape();
}
}
首先,由于您正在使用 noLoop()
,因此每当滑块发生变化时,您都需要重新绘制形状。
为此,您可以轻松地定义一个 on change 事件,如下所示:
sidesSlider.input(sliderChange);
我建议您在该函数中分配 noOfSides
变量的值。之后再次调用 draw
函数。
function sliderChange() {
noOfSides = sidesSlider.value();
draw();
}
由于您要在 draw
函数中删除对 noOfSides
的赋值,因此您需要在初始化时或在 `setup 函数中为该变量设置默认值。
...
noOfSides = 3;
...
那么你几乎可以开始了,我唯一不太明白的是你的代码的最后一部分。我删除了那部分,现在它按预期工作。
请注意,您正在使用 alpha
值设置背景颜色。这导致:在每次渲染形状时,最新的形状轮廓仍然几乎看不到。
这是您的代码的最新版本: https://editor.p5js.org/darcane/sketches/5wpp6UgXI