Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry 检查边缘是否有圆周运动_Geometry_Processing - Fatal编程技术网

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、 
equal
1.8
multiply
cosx=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
添加到了类定义中,其工作原理与我的屏幕截图类似。