Geometry 检查边缘是否有圆周运动
我想让我的点程序在到达边缘时掉头 所以基本上我只是简单地计算Geometry 检查边缘是否有圆周运动,geometry,processing,Geometry,Processing,我想让我的点程序在到达边缘时掉头 所以基本上我只是简单地计算 x=width/2+cos(a)*20 y=高度/2+sin(a)*20 它可以做圆周运动。所以我想通过检查边缘来扭转这个局面。我还使用println命令确保y达到if条件 class particles { float x, y, a, r, cosx, siny; particles() { x = width/2; y = height/2; a = 0; r = 20; } void display() { ellipse(x
x=width/2+cos(a)*20代码>
y=高度/2+sin(a)*20代码>
它可以做圆周运动。所以我想通过检查边缘来扭转这个局面。我还使用println命令确保y达到if条件
class particles {
float x, y, a, r, cosx, siny;
particles() {
x = width/2; y = height/2; a = 0; r = 20;
}
void display() {
ellipse(x, y, 20, 20);
}
void explode() {
a = a + 0.1;
cosx = cos(a)*r;
siny = sin(a)*r;
x = x + cosx;
y = y + siny;
}
void edge() {
if (x>width||x<0) cosx*=-1;
if (y>height||y<0) siny*=-1;
}
}
//setup() and draw() function
particles part;
void setup(){
size (600,400);
part = new particles();
}
void draw(){
background(40);
part.display();
part.explode();
part.edge();
}
类粒子{
浮点数x,y,a,r,cosx,siny;
粒子(){
x=宽度/2;y=高度/2;a=0;r=20;
}
无效显示(){
椭圆(x,y,20,20);
}
空洞爆炸(){
a=a+0.1;
cosx=cos(a)*r;
siny=sin(a)*r;
x=x+cosx;
y=y+siny;
}
空边(){
如果(x>width | | xheight | | y检查没有问题,那么问题在于,大概在下一次通过draw()
时,您会通过重置cosx
和siny
的值来忽略您对检查所做的响应
我建议创建两个新变量,dx
和dy
(“d”表示“方向”),这两个变量始终为+1和-1,并根据边缘检查更改这些变量。下面是一个简单的示例:
float a,x,y,cosx,siny;
float dx,dy;
void setup(){
size(400,400);
background(0);
stroke(255);
noFill();
x = width/2;
y = height/2;
dx = 1;
dy = 1;
a = 0;
}
void draw(){
ellipse(x,y,10,10);
cosx = dx*20*cos(a);
siny = dy*20*sin(a);
a += 0.1;
x += cosx;
y += siny;
if (x > width || x < 0)
dx = -1*dx;
if (y > height || y < 0)
dy = -1*dy;
}
浮点a,x,y,cosx,siny;
浮动dx,dy;
无效设置(){
尺寸(400400);
背景(0);
中风(255);
noFill();
x=宽度/2;
y=高度/2;
dx=1;
dy=1;
a=0;
}
作废提款(){
椭圆(x,y,10,10);
cosx=dx*20*cos(a);
siny=dy*20*sin(a);
a+=0.1;
x+=cosx;
y+=siny;
如果(x>宽度| | x<0)
dx=-1*dx;
如果(y>高度| | y<0)
dy=-1*dy;
}
运行此代码时,您将看到圆从边缘反弹:
请提供一个,包括一个最小的setup()
和draw()
。您的代码似乎是setup和draw之间的交叉。很抱歉,我在这个网站上是新的。他们(这个网站)请告诉我使用尽可能小的代码来说明问题。我将编辑整个代码,因为它是小代码。这一点不仅仅是最小的代码,而且是最小的可复制代码。足以让某人按原样运行并查看问题所在。在这种情况下,问题可能在于draw()
,这是你根本没有展示的东西。非常感谢,实际上我还是不明白这是怎么回事。我的意思是,如果我把cosx
本身变成负值,有什么区别。cosx=cos(a)*20、
equal1.8
multiplycosx=cosx*-1
cosx=-1.8
.cosx=-1*cos(a)*20
的结果是相同的-1.8
@user196173问题是当你有一行cosx=-1*cosx
与你有cosx=coas(a)时的结果是一样的*20
以及这与调用绘图代码的时间有何关系。您的问题没有显示相关代码(编辑的问题仍然没有显示)。引入和更改dx
的目的是在帧之间保持更改(直到遇到另一个边缘),但cosx=cos(a)*20
是(我猜)每帧完成。没有(可以按原样运行的东西)我只能猜测。啊,我知道了。我理解你的引用重置了值。因此,当我运行edge()
函数时,它会给我负值,但我只是在explode()
函数上重置我的值,它是cosx=cos(a)*20
使其与边缘()重叠。
函数。非常感谢您的指导me@user196173通过您的编辑,我的答案不再反映您的代码,尽管您可以使用相同的方法(使用dx
和dy
)或者完全放弃edge
方法,将该复选框移到explode
方法中。我只花了几秒钟就将dx,dy
添加到了类定义中,其工作原理与我的屏幕截图类似。