处理:for循环,对角线中的椭圆

Processing: For-loop, ellipses in diagonal lines

我几乎完成了一项锻炼,我必须为 class 做这件事。 我应该制作一个 for 循环,在对角线中创建椭圆。我的代码显示,但是我无法弄清楚为什么右上角的最后一个椭圆没有显示..我错过了什么?

size(400,400);

for( int x = 0; x <= 2; x++)
{

  ellipse(0 + x * 200 , 0 + x * 200 , 50, 50);
  ellipse(0 + x * 200, 400 + x * 200, 50, 50);
}

想想你的两个 ellipse() 语句在做什么:

ellipse(0 + x * 200 , 0 + x * 200 , 50, 50);: 这个在左上角画一个椭圆,然后在中间画一个椭圆,然后在右下角画一个椭圆

ellipse(0 + x * 200, 400 + x * 200, 50, 50);:这个在左下角画了一个椭圆。但是它绘制的其他 2 个椭圆将在屏幕边缘下方!

请记住,Y 值从 window 顶部的零开始。

尝试在 for 循环中使用 println() 语句,以真正了解发生了什么。如果您仍然无法解决问题,请先尝试在没有 for 循环的情况下执行此操作。你能只调用 ellipse() 函数 5 次吗?当您完成该工作后,请查看您传入的坐标,直到您看到可以在 for 循环内使用的模式。

这听起来有点混乱,因为有不同的方法可以做同样的事情。到目前为止,您似乎很熟悉循环,这很棒。

唯一看起来缺少的是计算值的反转。

您从 0 数到 2(含):

for( int x = 0; x <= 2; x++)

它给你 x 值 0,1,2 这在绘制从左上角到右下角的对角线时很有用,因为它匹配坐标系(0,0 在左上角)。

要绘制从左下角到右上角的对角线,您需要不同的值 所以而不是

(0,0)
(1,1)
(2,2)

您将需要:

(0,2)
(1,1)
(2,0)

获得范围内反向值的一种方法是从该范围的最大值中减去该范围内的值。

这里有一个非常基本的草图来说明这个概念:

strokeWeight(10);//make points large/easy to see
int max = 2;
for(int x = 0 ; x <= max; x++){
  float offset = x * 25;//spacing of 25

  int reverseX = max - x;
  float reverseOffset = reverseX * 25; 
  println("iteration " + x + " inverse iteration value: " + reverseX + " offset: " + offset + " reverseOffset: " + reverseOffset); 

//  point(offset,offset);
  point(reverseOffset,offset);
}

另一种选择是在 for 循环中使用两个计数器。 希望你的作业不认为这是作弊,它可能看起来更混乱,但还不错。

for(int x = 0, y = 3 ; x <= 3; x++, y--){

  println("iteration " + x + " reverse iteration: " + y); 

  point(x * 25,y * 25);
}

for 循环中唯一改变的部分是第一个(初始化)和最后一个(迭代)步骤。您正在初始化 2 个变量而不是一个:

  1. 第一个变量从 0 开始
  2. 第二个变量从最大值开始

在增量步骤中,您要处理两个变量:

  1. 第一个变量上升(用++递增)
  2. 第二个变量下降(递减 --)