处理:将随机星域的中心点移动到中心

Processing: Move centerpoint of a random Starfield to the center

我正在做一些带有处理的 space 模拟。在游戏中您可以放大和缩小太阳系。为了获得整洁的视差效果,我想放大背景中随机重新生成的星空。到目前为止,一切正常,但星空正在放大到左上角。我知道我必须将星星的原点转换为 (width/2,height/2),但我不知道该怎么做。

代码如下:

int starCount = 1200;
float[] xStar = new float[starCount];
float[] yStar = new float[starCount];
float starSpread;
float zoom;

void setup() {
  size(1600, 900);
  frameRate(30);
  calcStars();
  zoom = 1;
}   

void draw() {
  background(#000000);
   for(int i=0;i<starCount;i++){
     fill(#fff7e6);
     noStroke();
     ellipse(xStar[i]*starSpread,yStar[i]*starSpread,1,1);
   } 

  starSpread = 1+zoom*0.001; 
}


void calcStars(){
    for(int i=0;i<starCount;i++){
    xStar[i] = -random(0-width);
    }
    for(int i=0;i<starCount;i++){
    yStar[i] = -random(0-height);
    }
}

void mousePressed(){
   zoom = zoom - 1;
}

(点击鼠标"zoom"出来!<- 我要星星移动到中间而不是左上角)

所以,我有 2 个数组,在 window 中给我 1200 个随机坐标。 "zoom" 是一个简单的浮点数,可以用滑块控制。此变量控制所有内容的传播。它乘以 0.001 以对我的星星产生轻微的影响。

现在有人可以帮我实现我想要的缩放效果吗?

提前致谢!

有很多方法可以做到这一点,但基本方法是这样的:

第1步:计算每颗星星离屏幕中心的距离。

第 2 步:缩放该距离。

第 3 步:绘制每颗星星,按比例远离中心点。

int starCount = 1200;
float[] xStar = new float[starCount];
float[] yStar = new float[starCount];
float zoom = 1;

void setup() {
  size(1600, 900);
  frameRate(30);
  calcStars();
}   

void draw() {
  background(#000000);
  for (int i=0; i<starCount; i++) {
    fill(#fff7e6);
    noStroke();

    float centerX = width/2.0;
    float centerY = height/2.0;

    float xDistFromCenterX = centerX - xStar[i];
    float yDistFromCenterY = centerY - yStar[i];

    float scaledXDistFromCenterX = zoom * xDistFromCenterX;
    float scaledYDistFromCenterY = zoom * yDistFromCenterY;

    ellipse(centerX + scaledXDistFromCenterX, centerY + scaledYDistFromCenterY , 1, 1);
  } 

}

void calcStars() {
  for (int i=0; i<starCount; i++) {
    xStar[i] = -random(0-width);
  }
  for (int i=0; i<starCount; i++) {
    yStar[i] = -random(0-height);
  }
}

void mousePressed() {
  zoom = zoom + .1;
}

这行得通,我认为它非常接近您的目标,但您也可以考虑重构您的代码以使用 Star 对象来跟踪其自身的位置。每当您想缩放时,只需告诉每个 Star 对象移动即可。您也可以提前将开始绘制到图像上,然后缩放该图像。就像我说的,有很多方法可以做到这一点。