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