处理:将随机星域的中心点移动到中心
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
对象移动即可。您也可以提前将开始绘制到图像上,然后缩放该图像。就像我说的,有很多方法可以做到这一点。
我正在做一些带有处理的 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
对象移动即可。您也可以提前将开始绘制到图像上,然后缩放该图像。就像我说的,有很多方法可以做到这一点。