处理 float 的奇怪问题

标签 processing

我一直在努力解决这个问题几个小时,但无济于事。代码很简单,一个弹跳球(粒子)。将粒子的速度初始化为 (0, 0) 将使其保持上下弹跳。将粒子的初始化速度更改为 (0, 0.01) 或任何十进制浮点数都会导致小球减小

Particle p;

void setup() {
  size(500, 600);
  background(0);
  p = new Particle(width / 2, height / 2);

}

void draw() {
  background(0, 10);
  p.applyForce(new PVector(0.0, 1.0)); // gravity
  p.update();
  p.checkBoundaries();
  p.display();

}

class Particle {
  PVector pos, vel, acc;
  int dia;

  Particle(float x, float y) {
    pos = new PVector(x, y);
    vel = new PVector(0.0, 0.0);
    acc = new PVector(0.0, 0.0);
    dia = 30;
  }

  void applyForce(PVector force) {
    acc.add(force);
  }

  void update() {
    vel.add(acc);
    pos.add(vel);  
    acc.mult(0);
  }

  void display() {
      ellipse(pos.x, pos.y, dia, dia);
  }

  void checkBoundaries() {
    if (pos.x > width) {
      pos.x = width;
      vel.x *= -1;
    } else if (pos.x < 0) {
      vel.x *= -1;
      pos.x = 0;
    }
    if (pos.y > height ) {
      vel.y *= -1;
      pos.y = height;
    }
  }
}

最佳答案

我不是处理向量的专家,但我相信我已经弄清楚为什么会发生这种情况。如果您尝试使用速度矢量 y 部分的不同值来重现此问题,您会发现它仅在这些值不是 0.5 的倍数时才会发生。基于此,这条线可能负责:

if (pos.y > height ) {
  vel.y *= -1;
  pos.y = height;
}

这条线环绕球的高度,并反转它的速度。当球准确地击中 0 并在它返回之前获得额外的速度时,这很好用,但是当球比它应该的速度稍低时,不会添加来自额外迭代的速度。碰巧的是,0.5 的倍数恰好等于 0,但其他值则不然。我的证据是,当您将违规代码更改为以下内容时,每个值最终都会导致球落到地上:

if (pos.y >= height ) {
  vel.y *= -1;
  pos.y = height;
}

简而言之,当球击中 0 时,四舍五入而不是使球反弹会导致此问题。我希望这回答了你的问题。

关于处理 float 的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42508335/

相关文章:

java - 处理 - 如何绘制 x/y 轴大于窗口宽度/高度的散点图

audio - 正在处理fft崩溃

java - 处理中的 OpenCV pyrMeanShiftFilter——矩阵问题

java - 使用pushmatrix()函数的可点击3d形状来显示消息?

java - 创建一个可以充当另一个类的类

python - 用python模拟处理?

java - 如何使用 Java/Processing 调用子类上的方法?

java - 在处理: InternalError: java. awt.geom.NoninvertibleTransformException时使用缩放功能时收到以下错误:行列式为0

java - 处理 2.0 中 ArrayList<byte> 的语法错误

opencv - 当静态字段中存在多个对象时跟踪单个对象