Полностью непроверенный.
Что делать, если вы взяли направление линий из перекрестков и получили Principle Component
Это получит вам направление, они собираются. Затем создать плоскость с помощью этого направления и произвольной точку, проект все точки от вычислений плоскости пересечения на плоскости и найти среднюю точку этих прогнозируемых точек.
Используйте эту среднюю точку и основной компонент, чтобы определить свою линию.
Что-то вроде ...
class Plane
{
public:
Vector3 Point;
Vector3 Normal;
Line Intersect (const Plane &other);
Vector3 Project (const Vector3 &point);
}
class Line
{
public:
Vector3 Point;
Vector3 Direction;
Line (Vector3 point, Vector3 dir);
};
Vector3 PrincipleComponent (const std::vector<Line> &lines)
{
//You could use the covariance matrix to get this but I will try the interative method on wikipedia.
Vector3 p(1,2,3); //a random vector?
static const int c = 10;
for (int i = 0; i < c; ++i)
{
Vector3 t;
for (auto i = lines.begin(); i != lines.end(); ++i)
{
t = t + ((*i).Direction.Dot (p)) * (*i).Direction;
}
t.Normalize();
p = t;
}
return p;
}
int main()
{
std::vector<Line> LinesFromPlaneIntersections;
Vector3 direction = PrincipleComponent (LinesFromPlaneIntersections);
Plane projplane;
projplane.Normal = direction;
projplane.Point = LinesFromPlaneIntersections[0].Point;
Vector3 meanpoint;
for (auto i = LinesFromPlaneIntersections.begin(); i != LinesFromPlaneIntersections.end(); ++i)
{
meanpoint += projplane.Project ((*i).Point);
}
meanpoint /= LinesFromPlaneIntersections.size();
Line result (meanpoint,direction);
}
Это аналитическая геометрия вопрос, а не программирования вопрос. Я уверен, что в StackExchange есть более подходящие форумы, чтобы задать этот вопрос. –
Это также кажется несколько сложным. Самолеты пересекаются в линиях, так как вы определяете свою дистанционную функцию? Точка ближайшего приближения двух трехмерных линий? – TheMathemagician
Просто посыпьте несколько точек вдоль ваших прямых линий пересечения и вычислите наименьшие квадраты из точек. –