Geometry 我怎样才能画一个圆,让那个圆断裂,然后在别处开始画?
在处理过程中,我正在尝试构建我的第一个生成补丁。我想在屏幕上的某个地方画一个圆(沿着圆的路径的一个点),但在一段随机时间后,圆断了,线在一段随机时间内沿着随机方向移动,然后开始在其他地方画一个新的圆 现在我画了一个圆圈,我有一个切换机制,可以在一段随机时间后打开和关闭。我不知道如何让它从原来的圆圈中“打破”,更不用说让它在别处开始一个新的圆圈了。有人会对如何实现这一目标提出一些建议吗?我认为它可能有一个有趣的视觉效果Geometry 我怎样才能画一个圆,让那个圆断裂,然后在别处开始画?,geometry,processing,Geometry,Processing,在处理过程中,我正在尝试构建我的第一个生成补丁。我想在屏幕上的某个地方画一个圆(沿着圆的路径的一个点),但在一段随机时间后,圆断了,线在一段随机时间内沿着随机方向移动,然后开始在其他地方画一个新的圆 现在我画了一个圆圈,我有一个切换机制,可以在一段随机时间后打开和关闭。我不知道如何让它从原来的圆圈中“打破”,更不用说让它在别处开始一个新的圆圈了。有人会对如何实现这一目标提出一些建议吗?我认为它可能有一个有趣的视觉效果 Rotor r; float timer = 0; boolean freez
Rotor r;
float timer = 0;
boolean freeze = false;
void setup() {
size(1000,600);
smooth();
noFill();
frameRate(60);
background(255);
timeLimit();
r = new Rotor(random(width),random(height),random(40,100));
}
void draw() {
float t = frameCount / 100.0;
timer = timer + frameRate/1000;
r.drawRotor(t);
if(timer > timeLimit()){
timer = 0;
timeLimit();
if(freeze == true){
freeze = false;
}else{
freeze = true;
}
background(255);
}
}
float timeLimit(){
float timeLimit = random(200);
return timeLimit;
}
转子等级:
class Rotor {
color c;
int thickness;
float xPoint;
float yPoint;
float radius;
float angle = 0;
float centerX;
float centerY;
Rotor(float cX, float cY, float rad) {
c = color(0);
thickness = 1;
centerX = cX;
centerY = cY;
radius = rad;
}
void drawRotor(float t) {
stroke(c);
strokeWeight(thickness);
angle = angle + frameRate/1000;
xPoint = centerX + cos(angle) * radius;
yPoint = centerY + sin(angle) * radius;
ellipse(xPoint, yPoint,thickness,thickness);
}
}
调用
background()
通常是绘图中的第一件事。这是因为绘图仅在每个循环(帧)的末尾渲染。因此,在开始时调用bg将清除最后一帧中绘制的所有内容。如果需要持久化框架,可以删除对background()
的调用,或者在每个框架中绘制您的内容。或者在图形中绘制东西并显示出来
另一件事是每次“转子”停止时,你应该给它新的随机坐标
如果您要删除background()
调用,这将实现以下目的:
Rotor r;
float timer = 0;
boolean freeze = false;
void setup() {
size(1000,600);
smooth();
noFill();
frameRate(60);
background(255);
timeLimit();
r = new Rotor(random(width),random(height),random(40,100));
}
void draw() {
float t = frameCount / 100.0;
timer = timer + frameRate/1000;
r.drawRotor(t);
if(timer > timeLimit()){
timer = 0;
timeLimit();
//***** here new coordinates!!
r = new Rotor(random(width),random(height),random(40,100));
//*****
if(freeze == true){
freeze = false;
}else{
freeze = true;
}
//***** no background()
// background(255);
}
}
float timeLimit(){
float timeLimit = random(200);
return timeLimit;
}
class Rotor {
color c;
int thickness;
float xPoint;
float yPoint;
float radius;
float angle = 0;
float centerX;
float centerY;
Rotor(float cX, float cY, float rad) {
c = color(0);
thickness = 1;
centerX = cX;
centerY = cY;
radius = rad;
}
void drawRotor(float t) {
stroke(c);
strokeWeight(thickness);
angle = angle + frameRate/1000;
xPoint = centerX + cos(angle) * radius;
yPoint = centerY + sin(angle) * radius;
ellipse(xPoint, yPoint,thickness,thickness);
}
}
现在,如果您需要清除屏幕,您可以创建一个列表(ArrayList?)并在上一个列表完成后向其中添加一个新转子。但是,您需要管理转子,以便能够在不设置动画的情况下自行显示它。所以新创建的转子将设置动画,而旧的转子将只显示其圆弧而不设置动画。或者在不调用bg的情况下制作PGraphis,并将其显示在可以调用bg的主画布中
另一方面,请注意,在帧速率方面依赖于times,这使得系统性能可靠。您可以使用
millis()
执行相同的操作来避免这种情况。到目前为止还不是问题,因为这还很轻,但如果项目进一步发展,可能会成为问题。首先回答您关于“打破”圆的问题:您需要创建新的rotor
实例,或者只更改其属性,如center
和radius
。如果我的想法正确,您只需要一个rotor
实例,因此只需更改此值:
r.centerX=newX;
r、 centerY=newY
r、 radius=random(40100)//正如您在设置中所做的那样
但如何计算新的位置呢?它可能是随机的,但您希望创建路径,所以需要计算它。接下来是棘手的部分。那么,如何建立连接线并开始新的循环呢
首先,您需要两种模式
。第一个画圆,第二个画线。实现这一点的最简单方法是更新rotor
draw方法[您可以将mode
变量作为drawRotor
函数的参数或全局变量传递]:
if(mode == 1){
angle += frameRate/1000;
}else{
radius += 2;
}
正如你们所看到的,我只是在增加画圆的角度和增加画线的半径之间有所不同(不是在随机方向,而是从中心开始)。然后我们需要计算圆心的新位置。为此,我们根据角度
简单计算它将如何继续,并替换新的半径
,因此整个零件将如下所示:
if(mode != 1){
float newR = random(40,100);
float newX = r.centerX + cos(r.angle) * (r.radius - newR);
float newY = r.centerY + sin(r.angle) * (r.radius - newR);
r.newPos(newX, newY);
r.radius = newR; //we cant change it earlier because we need also old value
}
只有当您将模式更改回绘图循环时,“时间处理程序”函数中才会发生这种情况。模式可以在处理程序中简单地更改
mode *= -1; //but need to be init to 1 inside setup()
如果您想让路径始终可见,只需删除background()
函数,但如果您想要一些酷的效果,请在draw()请求时添加此函数
我粘贴整个代码只是为了演示,您应该根据自己的目的修改它。最好编写自己的版本
noStroke(); //No stroke needed and you turn it on again in drawRotor()
fill( 255,255,255, 10 ); //This will set transparency to 10%
rect(0,0,width,height); //You put layer after each "point" you draw
noFill(); //This will restore fill settings as you have before