【问题标题】:Processing: Move centerpoint of a random Starfield to the center处理:将随机星域的中心点移动到中心
【发布时间】:2016-02-11 21:18:35
【问题描述】:

我正在做一个带有处理的小空间模拟。在游戏中,您可以放大和缩小太阳系。为了得到一个整洁的视差效果,我想放大背景中随机再生的星空。到目前为止,我一切正常,但星空正在放大到左上角。我知道我必须将星星的原点转换为 (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;
}

(点击鼠标“缩小”!

所以,我有 2 个数组,在窗口中有 1200 个随机坐标。 “缩放”是一个简单的浮动,可以用滑块控制。此变量控制所有内容的传播。它乘以 0.001,对我的星星产生轻微的影响。

现在有人可以帮我按照我的意愿进行缩放吗?

提前致谢!

【问题讨论】:

  • 这段代码不能为我编译——你是不是少了几个右括号?
  • 哦,抱歉,我在浏览器实现方面遇到了一些问题。这会奏效。但是由于缺少库,滑块不在其中。 (编辑帖子)
  • /edit 单击鼠标多次将“缩小”以了解我的意思

标签: random processing center translate


【解决方案1】:

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

第 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 对象移动即可。您也可以提前将起点绘制到图像上,然后缩放该图像。就像我说的,有很多方法可以做到这一点。

【讨论】:

  • 哇,非常感谢您快速而完美的回答!这就是我需要的!我打算将图像作为紧急解决方案,但我希望它反应灵敏且干净;)
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2016-09-26
  • 2019-05-22
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多