public static Joint Intersect(Canguro.Model.Model model, LineElement l1, LineElement l2)
{
if (l1 != null && l2 != null && l1 != l2 && l1.I != l2.I && l1.J != l2.J && l1.I != l2.J && l1.J != l2.I)
{
float numer, denom;
float d1, d2, d3, d4, d5;
Vector3 p13 = l1.I.Position - l2.I.Position;
Vector3 p21 = l1.J.Position - l1.I.Position;
Vector3 p43 = l2.J.Position - l2.I.Position;
d1 = p13.X * p43.X + p13.Y * p43.Y + p13.Z * p43.Z;
d2 = p43.X * p21.X + p43.Y * p21.Y + p43.Z * p21.Z;
d3 = p13.X * p21.X + p13.Y * p21.Y + p13.Z * p21.Z;
d4 = p43.X * p43.X + p43.Y * p43.Y + p43.Z * p43.Z;
d5 = p21.X * p21.X + p21.Y * p21.Y + p21.Z * p21.Z;
denom = d5 * d4 - d2 * d2;
if (Math.Abs(denom) < 0.0001)
return null;
numer = d1 * d2 - d3 * d4;
float r = numer / denom;
float s = (d1 + d2 * r) / d4;
float scale = model.UnitSystem.FromInternational(1, Canguro.Model.UnitSystem.Units.Distance);
Vector3 pa = Vector3.Scale(l1.I.Position, scale) + Vector3.Scale(p21, r * scale);
Vector3 pb = Vector3.Scale(l2.I.Position, scale) + Vector3.Scale(p43, s * scale);
if (r > (-0.001) && r < 1.001 && s > (-0.001) && s < 1.001 && (pa - pb).Length() < 0.001 &&
((pa - l1.I.Position).LengthSq() > 0.000001f) && ((pa - l1.J.Position).LengthSq() > 0.000001f) &&
((pa - l2.I.Position).LengthSq() > 0.000001f) && ((pa - l2.J.Position).LengthSq() > 0.000001f))
{
Joint joint = new Joint(pa.X, pa.Y, pa.Z);
model.JointList.Add(joint);
return joint;
//SplitCmd.Split(l1, joint, model);
//SplitCmd.Split(l2, joint, model);
}
//// Create magnet
//PointMagnet intPtMagnet = new PointMagnet(l1.Position + Vector3.Scale(l1.Direction, r),
// PointMagnetType.Intersection);
//if (intPtMagnet.Snap(activeView, e.Location) < SnapViewDistance)
//{
// intPtMagnet.RelatedMagnets.Add(l1);
// intPtMagnet.RelatedMagnets.Add(l2);
// return intPtMagnet;
//}
}
return null;
}