在某些情况下无法使用的内置变量(处理 3)

Built-in variables not usable in certain cases (Processing 3)

过去几天我一直在用 Processing 3 构建一个程序(自 2009 年计算机科学入门以来第一次回到 Processing)并且一直遇到这个问题:

public class PolarMap {
    ...
    PVector[][] mapping = new PVector[width][height];
    PVector[][] cartesian = new PVector[width][height];
    PVector cart = new PVector();
    PVector polar = new PVector();

    /**
    Maps every pixel on the cartesian plane to a polar coordinate        
    relative to some origin point.
    */
    public void Map(float originX, float originY){
        for (int x=0; x < width; x++){
            for (int y=0; y < height; y++){
            ...
            cart.add(x, y);
            polar.add(r, theta);
            mapping[x][y] = polar; ***
            cartesian[x][y] = cart; 
      }
    }
  }
  ...
}

在 *** 的线上,我总是会抛出数组索引越界。我搜索了 SO、Reddit 和 Processing 自己的文档来找出原因。如果您不熟悉 Processing,宽度和高度都是内置变量并且等于像素高和横跨您的 canvas 的数量如 setup() 方法中声明的那样(在我的例子中为 800x800) .出于某种原因,两个数组都没有被初始化为这个值——相反,它们被初始化为这些变量的默认值:100。

所以,因为它没有意义,但那是其中之一,我尝试声明新变量:

int high = height;
int wide = width;

并用这些变量初始化数组。你不知道吗,这解决了问题。我现在有两个 800x800 阵列。

所以这是我的问题:为什么内置变量在用于初始化数组时没有按预期工作,但在分配给定义的变量时却完全按照预期的方式工作?

想想 widthheight 变量何时获得它们的值。考虑这个示例草图:

int value = width;

void setup(){
   size(500, 200);
   println(value);
}

如果你 运行 这个程序,你会看到它打印 100,即使 window 是 500 像素宽。这是因为 int value = width; 行发生 设置宽度之前!

为了使其按您期望的方式工作,您必须在调用 size() 函数后 设置 value 变量 。所以你可以这样做:

int value;

void setup(){
   size(500, 200);
   value = width;
   println(value);
}

将任何初始化移动到 setup() 函数内部,在 size() 函数被调用后,你会没事的。