delphi - 如何影响 2 个动画对象的 2 个角度?

标签 delphi math angle

您好,提前感谢您的帮助

这是我所拥有的:

  • 多个对象随机移动的 2D 平面图。
  • 每个对象都有一个位置 (x,y) 和一个整数方向(0 到 360)。

这是我想要实现的目标:

  1. 当两个物体变得很近时(假设距离 < 20 像素),我想让它们的方向改变,以便它们变得更远。
  2. 当它们变得有点远(距离 40 到 60 像素)时,我想改变它们的方向,使它们变得更近。
  3. 在 20 岁到 40 岁之间,他们互相关注(但这部分我很容易做到)
  4. 如果距离> 60 px,他们就会互相忽略(这部分也已经没问题了)

对于第 1 点和第 2 点,我遇到了一些困难:

  • 要比较两个角度(在简单情况下没问题,但如果一个物体角度为 359,另一个为 2,我找不到一种好方法来计算它们的实际方向接近,尽管 359 - 2 = 357。
  • 对两个对象应用微小的变化,使它们看起来相互影响。 只是要注意:如果两个对象的方向截然不同,它们可以互相忽略。

例如,当前当物体太近(距离< 20)时我正在这样做: self 是当前对象,b 是相同类型的另一个对象。

self.SetDirection( self.direction - ( b.direction - self.direction ));

当对象在 20-60px 之间时

self.SetDirection( direction + ( b.direction - self.direction ));

setdirection 方法(我知道它很难看,而且可能是错误的):

function TBoid.toAngle360(angle: double): double;
begin
  if angle < 0
  then angle := 360 - ( abs(round(angle)) mod 360 )
  else if angle > 360
       then angle := round(angle) mod 360;

  result := angle;
end;   

如果有人可以帮助我,给出一些解释或指出我的错误,我将非常感激。 我在这个网站或谷歌上找不到任何合适的答案,而且我对三角计算、角度、弧度和所有这些都很弱......

谢谢

最佳答案

更可靠的方法是尽量减少使用角度。

使用速度分量 vxvy 代替角度(请注意 vx=v*cos(direction),与 类似vysin)。

要比较方向相似度,请计算方向向量的点积(按其长度归一化)

dot = (vx1 * vx2 + vy1 * vy2) / (len1*len2)
where 
len1 = Hypot(vx1,vy1)

对于共线向量,点积的值为 1,对于接近的方向,点积的值为 0,对于垂直向量,点积的值为 0,对于反共线向量,点积的值为 1(注意,这相当于计算角度差余弦)。

要产生相互影响,请应用重力或库仑力之类的东西 - 物体对另一个物体产生力(因此是加速度)。因此速度分量会发生变化。

例如,您有几乎共线的向量,其分量为 vx, vy。求法向量N

nx = -vy
ny = vx

并将 N*coeff 添加到一个速度,将 -N*coeff 添加到另一个速度,使它们发散或收敛(取决于 coeff< 的符号)。 coeff的值对应于物体之间的距离计算。

关于delphi - 如何影响 2 个动画对象的 2 个角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64790608/

相关文章:

德尔福文件类型

arrays - 在delphi中传递不同枚举类型的混合

delphi - 如何重新启动 Interbase

java - 需要有关 Base85 (Ascii85) 编码器的帮助

math - 给定法线向量,在 3D 空间中的 2D 磁盘上生成随机点

python math.log 在较大的 int 下输出不准确?

c++ - 将角度表示为 cos/sin 对

windows - 将 Delphi EXE 发布到 Windows 应用商店

android - 确定智能手机摄像头的视角

actionscript-3 - 使用 AS3 绘制部分圆时角度错误