函数和线的交集

时间:2011-05-06 16:36:45

标签: c++ function math intersection

我试图找到一种方法来找到函数和线之间的第一个交点。我不知道是否有可能。

我的想法是,我有一个线段,然后我有一个盒子在它移动通过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);
}

所以我的问题是,考虑到盒子的开始和结束位置,以及它的角速度,是否有可能找到轨道顶点和给定线的第一个交点?

2 个答案:

答案 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)。