Geometry 与椭圆碰撞
对于椭圆台球台,如何检测并解决该台边界与一个台球之间的碰撞 我想看看台球的位置p(x,y)是否在Geometry 与椭圆碰撞,geometry,collision,ellipse,Geometry,Collision,Ellipse,对于椭圆台球台,如何检测并解决该台边界与一个台球之间的碰撞 我想看看台球的位置p(x,y)是否在 里面 在 或者在椭圆的边界之外[更新:第1部分已解决] 2.)如果它位于边界上或边界外,则必须计算新速度(仅翻转速度是不够的) 3.)如果它位于外部,则必须先将其移回到边界上 ======== ==== * ==== ==== ==== = = ===
- 里面
- 在
- 或者在椭圆的边界之外[更新:第1部分已解决]
========
==== * ====
==== ====
= =
==== ====
==== ====
========
给定的是台球的位置p(x,y)和速度V(x,y),加上椭圆中心C(x_0,y_0)和椭圆的两个半轴a,b的位置 既然您考虑的是椭圆形(即凸形)板,我想您可以使用基于。您将获得碰撞期间的接触点和曲面法线,以及在没有碰撞的情况下对象与关联见证点之间的最小距离 GJK的碰撞检测速度非常快,您可以很容易地为其他形状实现它(您只需要重新编码图形)。对于椭圆,我认为支持函数应该是这样的(尝试验证): h=((x^2)/(a^4)+(y^2)/(b^4))^(-1/2) 一些链接:
((p.x-x0)/a)^2 + ((p.y-y0)/b)^2 = k
如果k<1->在椭圆内
如果k==1->在椭圆上
如果k>1->在椭圆外用椭圆表做一些有趣的实验。Delphi代码(没有错误处理!) A=125,B=100
从椭圆中心(左图)开始,从右焦点(右图)开始,ball到达左焦点,然后返回右焦点我非常喜欢解决这样的问题,您是否计划对解决方案进行编码?另外,您是否只想看看p(x,y)是否位于椭圆的边界上?我编辑了我的问题以包含更多细节。我已经做了一个圆,但我似乎找不到椭圆的正确起点。不知道为什么我没有看到,谢谢!现在,不太令人愉快的部分是:如果球在椭圆外,则需要将其设置回椭圆边界上的对应点(即,球在两帧之间成功逃逸)。此外,我注意到仅仅翻转速度是不够的。相反,我需要计算新的速度?你的意思是“如果k==1->在椭圆上”?谢谢,但我想找到我自己的解决方案(需要一些帮助)。
//calculates next ball position in ellipse
//ellipse semiaxes A, B, A2 = A * A, B2 = B * B
//center CX, CY
//PX,PY - old position, VX,VY - velocity components
//V - scalar velocity V = Sqrt(VX * Vx + VY * VY)
procedure TForm1.Calc;
var
t: Double;
eqA, eqB, eqC, DD: Double;
EX, EY, DX, DY, FX, FY: Double;
begin
//new position
NPX := PX + VX;
NPY := PY + VY;
//if new position is outside
if (B2 * Sqr(NPX) + A2 * Sqr(NPY) >= A2 * B2) then begin
//find intersection point of the ray in parametric form and ellipse
eqA := B2 * VX * VX + A2 * VY * VY;
eqB := 2 * (B2 * PX * VX + A2 * PY * VY);
eqC := -A2 * B2 + B2 * PX * PX + A2 * PY * PY;
DD := eqB * eqB - 4 * eqA * eqC;
DD := Sqrt(DD);
//we need only one bigger root
t := 0.5 * (DD - eqB) / eqA;
//intersection point
EX := PX + t * VX;
EY := PY + t * VY;
//mark intersection position by little circle
Canvas.Ellipse(Round(EX - 2 + CX), Round(EY - 2 + CY),
Round(EX + 3 + CX), Round(EY + 3 + CY));
//ellipse normal direction
DX := B2 * EX;
DY := A2 * EY;
DD := 1.0 / (DY * DY + DX * DX);
//helper point, projection onto the normal
FX := DD * (NPX * DX * DX + EX * DY * DY - DY * DX * EY + DX * DY * NPY);
FY := DD * (-DX * DY * EX + DX * DX * EY + DX * NPX * DY + DY * DY * NPY);
//mirrored point
NPX := NPX + 2 * (EX - FX);
NPY := NPY + 2 * (EY - FY);
//new velocity components
DD := V / Hypot(NPX - EX, NPY - EY);
VX := (NPX - EX) * DD;
VY := (NPY - EY) * DD;
end;
//new position
PX := NPX;
PY := NPY;
//mark new position
Canvas.Ellipse(Round(PX - 1 + CX), Round(PY - 1 + CY),
Round(PX + 1 + CX), Round(PY + 1 + CY));
end;