我试图找到一种方法来找到函数和线之间的第一个交点。我不知道是否有可能。
我的想法是,我有一个线段,然后我有一个盒子在它移动通过2space时旋转。我已经制作了这两个函数,它们表示当盒子在2space中移动时其中一个顶点的位置。基本上,函数表示线性地通过2空间移动的框的点或顶点的旋转。
float F_X(float time) // X coordinate of the vertex at a certain time
{
return VertX * COS(Degrees * time)
- VertY * SIN(Degrees * time)
+ time * Velocity;
}
float F_Y(float time) // Y coordinate of the vertex at a certain time
{
return VertX * SIN(Degrees * time)
+ VertY * COS(Degrees * time)
+ time * 0;// no velocity on y for this example
}
float F_Center(float time) // center position of the box along it's path
{
return (time * Velocity);
}
所以我的问题是,考虑到盒子的开始和结束位置,以及它的角速度,是否有可能找到轨道顶点和给定线的第一个交点?
答案 0 :(得分:2)
1)用等式A*x+B*y=C
表示该行,这样如果它经过(x1,y1)
和(x2,y2)
,那么等式为x*(y2-y1)+y*(x1-x2)=x1*y2-x2*y1
。
2)任何点(xp,yp)
与该行的签名距离为:
d = (A*xp+B*yp-C)/sqrt(A*A+B*B)
或
d=( yp*(x2-x1)-xp*(y2-y1)+x1*y2-x2*y1 )/sqrt((x2-x1)^2+(y2-y1)^2)
当d
切换后,该点就越过了
3)对于小时间增量Dt
,点位置改变
(Dxp,Dyp)=Dt*(Vx+Omg*(Vy*t-yp),Vy+Omg*(xp-Vx*t))
其中Omg
是旋转速度(在您的情况下是Omg=Degrees
),(Vx,Vy)
是中心速度(在我们的例子中是(Velocity,0)
),t
是时间。
4)在时间d1
找到距离t1
,并在d2
之后的一小段时间内估算距离t2
。为了使Dtc
的时间步长t1
之间的距离为零,拟合一条线到两个距离估计值
d_est = d1 + (d2-d1)*Dtc/(t2-t1)
并解决d_est=0
的{{1}}。
当然,不是估计下一个位置,而是可以采取步骤并进行测量,然后及时返回到交叉点。无论如何,我已经为您提供了以数字方式解决这个问题的工具。
答案 1 :(得分:1)
简短回答:您必须经常采样并检测顶点何时位于该线的远端。
你还没有说过线的方向,但是我们可以(不失一般性)旋转整个问题,把线放到方便的位置,比如Y轴。我们也可以忽略与线平行的盒子或顶点的任何运动。所以整个事情简化为:
X = R cos(欧米茄*时间)+ V x *时间+ X 0
其中X 0 是顶点的初始位置,R是它与盒子中心的距离(R 2 = VertX 2 + VertY 2 )。没有整齐的分析方法来解决这个等式(也就是说,找到X = 0的时间),所以你只需要多次计算它并选择第一个X> 0(假设你开始了) X 0 < 0)。