Это более или менее тот же самый ответ, который дал Говард, но вдавленный в C # ... Надеюсь, это поможет с вашей базой кода.
Этот фрагмент кода должен помочь (найти средние точки из ваших 4, но только если все коллинеарны) - также обратите внимание, что я не проверяю реальное пересечение, вы можете легко сделать это самостоятельно, проверив ответ и ваши очки.
Я не потратил время и разумно реализовал структуру Vector3D (операторы, ...) - вы тоже можете легко это сделать.
Также обратите внимание, что это сработает не только для 4 баллов, но и для вашей диаграммы.
private struct Vector3D
{
public double X { get; set; }
public double Y { get; set; }
public double Z { get; set; }
}
static class Vectors
{
static public double ScalProd(Vector3D v1, Vector3D v2)
{
return v1.X*v2.X + v1.Y*v2.Y + v1.Z*v2.Z;
}
static public Vector3D Minus(Vector3D v1, Vector3D v2)
{
return new Vector3D {X = v1.X - v2.X, Y = v1.Y - v2.Y, Z = v1.Z - v2.Z};
}
static public Vector3D Normalize(Vector3D v)
{
var len = Math.Sqrt(ScalProd(v, v));
return new Vector3D {X = v.X/len, Y = v.Y/len, Z = v.Z/len};
}
}
private Vector3D[] FindIntersectionOnCoLinearVectors(params Vector3D[] input)
{
if (input.Length < 2) throw new Exception("you need a minimum of two vectors");
var v0 = input[0];
var direction = Vectors.Normalize(Vectors.Minus(input[1], v0));
Func<Vector3D, double> projectOntoLineStartingAtv0 =
v => Vectors.ScalProd(direction, Vectors.Minus(v, v0));
var mapped = input.OrderBy(projectOntoLineStartingAtv0).ToArray();
return new Vector3D[] {mapped[1], mapped[2] };
}