Пересечение функции и линии - PullRequest
1 голос
/ 06 мая 2011

Я пытаюсь найти способ найти первую точку пересечения между функцией и линией.Я даже не знаю, возможно ли это вообще.

Идея состоит в том, что у меня есть отрезок, а затем у меня есть коробка, которая вращается, пока она движется через 2 пространства.Я сделал эти две функции, которые представляют положение одной из вершин бокса, когда он перемещается в пространстве 2.По сути, функции представляют собой вращение точки или вершины прямоугольника, который линейно движется через пространство 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 ]

2 голосов
/ 06 мая 2011

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 для Dtc = d1*(t2-t1)/(d1-d2).

Конечно, вместо оценки следующей позиции, вы можете сделать шаг и измерить его, а затем вернуться назад во времени к точке пересечения.Несмотря на это, я дал вам инструменты, чтобы решить это численно.

1 голос
/ 06 мая 2011

Краткий ответ: Вам придется часто выбирать и определять, когда вершина находится на дальней стороне линии.

Вы ничего не сказали об ориентации линии, но мы можем (без потери общности) повернуть всю проблему, чтобы расположить линию в удобном месте, например, по оси Y. Мы также можем пренебречь любым движением прямоугольника или вершины, параллельным прямой. Таким образом, все сводится к:

X = R cos (омега * время) + V x * время + X 0

, где X 0 - начальная позиция вершины, а R - ее расстояние от центра прямоугольника (R 2 = VertX 2 + VertY 2 ). Нет точного аналитического способа решить это уравнение (то есть найти время, когда X = 0), поэтому вам просто нужно вычислить его много раз и выбрать первый, для которого X> 0 (при условии, что вы начали с X 0 <0). </p>

...