我正在尝试在Processing上实现动画螺旋曲线,以便在每个draw()函数中逐渐构建曲线。我已经成功地将曲线创建为静态形状 - 现在我试图更进一步。
不幸的是,尽管我付出了努力,但我的代码似乎并没有起作用。经过一段等待时间后,我再次获得静态形状以及以下错误消息:
你必须在curveVertex()之前使用beginShape()或beginShape(POLYGON)
与此消息相反,我已经有一个beginShape()指令(可能在错误的地方?)
这是我的代码:
float x,y;
float stepSize;
float angle;
int counter;
void setup() {
size(900, 600);
background(255);
frameRate(30);
smooth();
//noStroke();
stroke(0);
x = 0;
y = 0;
stepSize = 6;
angle = radians(270);
counter = 0;
}
void draw() {
translate(width/3, height/2);
if (counter == 0) {
beginShape();
curveVertex(x, y); // initial control point
} else {
if (stepSize > 1.0) {
curveVertex(x, y);
x = x + cos(angle) * stepSize;
y = y + sin(angle) * stepSize;
stepSize = stepSize * 0.99;
angle = angle - radians(1.5);
} else {
// return to previous x,y values for last control point
angle = angle + radians(1.5);
stepSize = stepSize / 0.99;
y = y - sin(angle) * stepSize;
x = x - cos(angle) * stepSize;
curveVertex(x, y); // last control point
endShape();
}
}
counter++;
}
提前感谢您提供的任何帮助! - 伊利亚斯
答案 0 :(得分:1)
尝试在多次调用beginShape()
函数之间拆分curveVertex()
,endShape()
,draw()
组似乎很奇怪。
相反,你应该跟踪你想要绘制的每个点 - ArrayList<PVector>
在这里会派上用场。要绘制曲线,只需迭代ArrayList
并绘制每个点。要扩展曲线,只需向其添加PVector
。
float stepSize = 6.0;
float angle= radians(270);
ArrayList<PVector> points = new ArrayList<PVector>();
void setup() {
size(900, 600);
frameRate(30);
points.add(new PVector(0, 0));
}
void draw() {
background(255);
translate(width/3, height/2);
//draw previous points
beginShape();
for (PVector point : points) {
curveVertex(point.x, point.y);
}
endShape();
if (stepSize > 1.0) {
//add a new point
PVector prevPoint = points.get(points.size()-1);
float x = prevPoint.x + cos(angle) * stepSize;
float y = prevPoint.y + sin(angle) * stepSize;
points.add(new PVector(x, y));
stepSize = stepSize * 0.99;
angle = angle - radians(1.5);
}
}
你只能存储最近绘制的点并累积绘制调用,但重绘每一点可能是解决此类问题的最常用方法。