循环和旋转。有没有办法让它保持在界限内?

时间:2016-05-10 20:17:42

标签: while-loop rotation processing translate boundary

我正在使用while循环,旋转和翻译以获得我想要的程序效果。我希望能够在草图的边界内包含循环。任何人都可以向我解释如何做到这一点,拜托?

以下是代码:

       
DP

1 个答案:

答案 0 :(得分:1)

您的问题仍然很广泛,而且尝试调试的代码仍然很多。但是我很欣赏你经历了缩小范围的麻烦,所以我会试着提供一般的帮助。

你的代码涉及很多我不太了解的东西,所以我将从一个更简单的例子开始。老实说,你可能会更好地做同样的事情 - 从更基本的东西开始,并从头开始添加边界逻辑 。在你已经写完所有内容之后,这比试图添加它要容易得多。

因此,在Processing中有两种主要的方法可以做这种类型的动画。我将覆盖两者。

选项1:依靠translate()rotate()为您定位内容。

这就是您的代码所做的事情。这是一个更简单的示例,显示围绕鼠标位置旋转的椭圆:

 
float angle = 0;

void setup() {
  size(500, 500);
}

void draw() {

  angle+=.1;

  background(0);
  translate(mouseX, mouseY);
  rotate(angle);
  translate(100, 0);

  ellipse(0, 0, 50, 50);
}

现在,如果要将椭圆限制在窗口内,首先需要确定椭圆在屏幕上的位置。这可能很复杂,因为我们使用translate()rotate()函数,这有点像移动相机而不是移动椭圆 - 椭圆&# 34;认为"它仍处于0,0位置。所以我们需要在移动相机后获得椭圆的位置。幸运的是,处理为我们提供了screenX()screenY()函数:

float screenX = screenX(0, 0);
float screenY = screenY(0, 0);

这将告诉我们在屏幕上将绘制椭圆的位置(或更准确地说,在应用变换后位置0,0将在何处)。我们可以使用它来检查它们是否超出了窗口的范围,然后做你想要的任何边界。

你做什么类型的边界取决于你想要发生什么。您可以将动画包裹在屏幕周围,这样当它从右侧移开时,它会重新出现在左侧。你可以限制位置,使它们只到窗口的边界而不是移过它。这是:

float angle = 0;

void setup() {
  size(500, 500);
}

void draw() {

  angle+=.1;

  background(0);
  translate(mouseX, mouseY);
  rotate(angle);
  translate(100, 0);

  float screenX = screenX(0, 0);
  float screenY = screenY(0, 0);

  if (screenX < 25) {
    rotate(-angle);
    translate(25-screenX, 0); 
    rotate(angle);
  } else if (screenX > 475) {
    rotate(-angle);
    translate(475-screenX, 0); 
    rotate(angle);
  }

  if (screenY < 25) {
    rotate(-angle);
    translate(0, 25-screenY);
    rotate(angle);
  } else if (screenY > 475) {
    rotate(-angle);
    translate(0, 475-screenY);
    rotate(angle);
  }

  ellipse(0, 0, 50, 50);
}

此代码与上述代码相同,只是现在使用screenX()screenY()来确定椭圆何时离开屏幕,然后使用translate()将其移回内部屏幕的界限。

选项2:自己跟踪位置。

您可以使用一些基本的代数和触发来自行定位,而不是依靠translate()rotate()进行定位。

这是一个简单的程序,没有限制:

float angle = 0;

void setup() {
  size(500, 500);
}

void draw() {

  angle+=.1;

  background(0);

  float circleX = mouseX + cos(angle)*100;
  float circleY = mouseY + sin(angle)*100;

  ellipse(circleX, circleY, 50, 50);
}

请注意,我自己计算椭圆的位置,而不是依靠translate()rotate()。现在可能更容易考虑圆圈的确切位置,所以我可以做边界:

float angle = 0;

void setup() {
  size(500, 500);
}

void draw() {

  angle+=.1;

  background(0);

  float circleX = mouseX + cos(angle)*100;
  float circleY = mouseY + sin(angle)*100;

  if (circleX < 25) {
    circleX = 25;
  } else if (circleX > 475) {
    circleX = 475;
  }

  if (circleY < 25) {
    circleY = 25;
  } else if (circleY > 475) {
    circleY = 475;
  }

  ellipse(circleX, circleY, 50, 50);
}

这可能更容易思考,因为您可以直接使用屏幕坐标。两种选择都做同样的事情,它们只是不同的思考方式。

从这里开始,只需确定你的边界应该如何运作。我给你举了一个例子,但你可以做任何你想做的事。

您可能还想限制输入变量(在我的情况下,mouseXmouseY),以便动画永远不会离开窗口。在顶部添加此项上述任一选项的draw()功能将阻止动画离开屏幕:

  if (mouseX < 150) {
    mouseX = 150;
  } else if (mouseX > 350) {
    mouseX = 350;
  }

  if (mouseY < 150) {
    mouseY = 150;
  } else if (mouseY > 350) {
    mouseY = 350;
  }

同样,你如何做到这一点取决于你和你想要发生的事情。如果你重新使用像我这样的基本程序,然后一次添加一个小东西,而不是试图将它添加到你现有的大草图中,这可能会更容易。祝你好运。