Java 为什么在这个草图中我的PVector应该保持不变

Java 为什么在这个草图中我的PVector应该保持不变,java,processing,Java,Processing,我正在画一幅素描,目前有两类;步行器和发射器。步行者进行随机柏林噪声步行,并随时间逐渐消失。发射器是指发出漫游者的点,具有描述发射器位置的PVector“position”和描述每帧动画发射的漫游者密度的float“density” 我有两个问题。第一个也是最严重的问题是,出于某种原因,我的emitter类中的position PVector会随着时间的推移而变化(看起来好像我以某种方式使它也随机移动)。这是怎么发生的?请注意,在emit()方法中,我有一个注释行,每次强制使用相同的PVecto

我正在画一幅素描,目前有两类;步行器和发射器。步行者进行随机柏林噪声步行,并随时间逐渐消失。发射器是指发出漫游者的点,具有描述发射器位置的PVector“position”和描述每帧动画发射的漫游者密度的float“density”

我有两个问题。第一个也是最严重的问题是,出于某种原因,我的emitter类中的position PVector会随着时间的推移而变化(看起来好像我以某种方式使它也随机移动)。这是怎么发生的?请注意,在emit()方法中,我有一个注释行,每次强制使用相同的PVector,这完全符合预期

第二个问题是,步行者似乎既倾向于向东北方向漂移,又似乎松散地束缚在一个正方形中。我不知道是什么原因导致了这种行为,因此任何见解都将不胜感激

干杯

代码:

arraylistwalkers;
阵列式发射器;
int tmax=1200;
int步长=2;
int nWalkers=50;
无效设置(){
规模(10241024);
帧率(60);
walkers=newarraylist();
发射器=新的ArrayList();
发射器。添加(新发射器(新PVector(宽度/2,高度/2),0.5));
}
作废提款(){
对于(发射器e:发射器){
e、 发射();
}
填充(255,50);//alpha将控制淡出(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaan)
仰泳();
rect(0,0,宽度,高度);//为步行者创建淡入淡出的尾巴
对于(int i=walkers.size()-1;i>=0;i--){
Walker w=(Walker)walkers.get(i);
如果(w.时间>tmax){
移除(i);
}
w、 步行();
w、 displayline();
}
}
类发射器{
PVector位置;
漂浮密度;
发射器(PVector positionIni、浮动密度ini){
位置=位置i;
密度=densityIni;
}
void emit(){
if(随机(1000)>贴图(密度,0,1,0,1000)){
添加(新步行者(位置,新PVector(随机(-10,10),随机(-10,10));//不起作用
//增加(新步行者(新PVector(宽度/2,高度/2),新PVector(随机(-10,10),随机(-10,10)));
}
}
}
学步车{
PVector位置、位置;
PVector noff,step;
整数时间;
沃克(PVector locationIni,PVector noffIni){
位置=位置ini;
位置=新的PVector(位置.x,位置.y);
noff=noffIni;
步长=新的PVector(map(noise(noff.x)、0、1、-stepSize、stepSize)、map(noise(noff.y)、0、1、-stepSize、stepSize));
时间=0;
}
void displayline(){
冲程重量(1);
填充(映射(时间,0,tmax,0,255));
笔划(map(时间,0,tmax,0,255));
//椭圆(位置x,位置y,1,1);
行(plocation.x,plocation.y,location.x,location.y);
时间++;
}
虚空行走(){
plocation.x=location.x;
plocation.y=location.y;
步长x=映射(噪声(noff.x),0,1,-步长,步长);
步长y=map(噪声(noff.y),0,1,-步长,步长);
位置。添加(步骤);
noff.x+=0.05;
noff.y+=0.05;
}
}
我有两个问题。第一个也是最严重的问题是,出于某种原因,我的emitter类中的position PVector会随着时间的推移而变化(看起来好像我以某种方式使它也随机移动)。这是怎么发生的?请注意,在emit()方法中,我有一个注释行,每次强制使用相同的PVector,这完全符合预期

你已经准确地描述了这个问题。您正在将
位置
变量传递给
Walker
类,然后
Walker
类正在更改此行中的
PVector

location.add(step);
因为您正在更改传入的变量,所以您正在更改原始的
位置
变量。这就是为什么如果您传入一个不同的
PVector
实例,它可以正常工作的原因

要解决此问题,您可能需要查看
PVector
类的
copy()
函数。更多信息可在中找到

第二个问题是,步行者似乎既倾向于向东北方向漂移,又似乎松散地束缚在一个正方形中

之所以出现平方,是因为最大边界是一个平方。考虑一下你的职位可能达到的最大价值。这形成了一个正方形,所以如果你在这个正方形中有一堆位置,你就会看到正方形的形状。要解决这个问题,你必须使用一些基本的三角学来使最大值变成一个圆。基本上:存储航向和速度,然后使用
cos()
sin()
计算位置。谷歌是你在这里的朋友

如果您注意到它们朝某个方向移动,则表示您的随机数生成已关闭。尝试将这条线拆分为多个步骤,以准确跟踪偏差的来源:

step = new PVector(map(noise(noff.x), 0, 1, -stepSize, stepSize), map(noise(noff.y), 0, 1, -stepSize, stepSize));

事实上,我知道命名很混乱,但位置PVector表示步行者的位置,而位置PVector表示发射器。我通过walkers.add(新的Walker(新的PVector(position.x,position.y)、新的PVector(random(-10,10)、random(-10,10)))解决了这个bug;而不是通过批发的立场。谢谢你给我的关于随机数生成的其他建议this@niklz命名并不混乱。给变量起两个不同的名字并不重要。它们指向同一个物体。改变其中一个会改变另一个。您创建新的
PVector
的解决方案与我建议的使用
copy()
函数的方法完全相同,只是需要更多的代码:哦,对了。谢谢,我不知道变量是这样工作的@niklz为了给你一个很好的解释,我强烈推荐你阅读并跟进。
step = new PVector(map(noise(noff.x), 0, 1, -stepSize, stepSize), map(noise(noff.y), 0, 1, -stepSize, stepSize));