public static double CheckStabilityForReference(SubAssembly newSubAsm, FootprintFace f) { var refCOM = newSubAsm.Install.Reference.CenterOfMass; CenterOfMassProjectionOnFootprintFace(f, refCOM); f.MinDisNeaEdg = double.PositiveInfinity; var x02 = f.COMP.Position[0]; var y02 = f.COMP.Position[1]; var z02 = f.COMP.Position[2]; f.Height = Math.Sqrt(Math.Pow(x02 - refCOM.Position[0], 2) + Math.Pow(y02 - refCOM.Position[1], 2) + Math.Pow(z02 - refCOM.Position[2], 2)); foreach (var edge in f.OuterEdges) { var edgeVector = edge.From.Position.subtract(edge.To.Position).normalize(); var distanceOfEdgeToComProj = GeometryFunctions.DistanceBetweenLineAndVertex(edgeVector, edge.From.Position, f.COMP.Position); if (distanceOfEdgeToComProj < f.MinDisNeaEdg) { f.MinDisNeaEdg = distanceOfEdgeToComProj; f.IsComInsideFace = IsTheProjectionInsideOfTheFace(f, edge); } } var spf = Math.Pow(((2 / Math.PI) * (Math.Atan(f.Height / f.MinDisNeaEdg))), 2); f.RefS = spf; return(f.RefS); }
private static double RadiusOfBoundingCylinder(TessellatedSolid solid, double[] faceCenters, double[] vector) { var maxDistance = double.NegativeInfinity; foreach (var vertex in solid.Vertices) { var dis = GeometryFunctions.DistanceBetweenLineAndVertex(vector, faceCenters, vertex.Position); if (dis > maxDistance) { maxDistance = dis; } } return(maxDistance); }
internal static FastenerAndNutPartition PartitionOfThePoint(List <FastenerAndNutPartition> partitions, double[] point) { FastenerAndNutPartition chosenPrtn = null; var sumDisToEdgs = double.PositiveInfinity; foreach (var prtn in partitions) { var dis1 = GeometryFunctions.DistanceBetweenLineAndVertex( prtn.Edge1[0].Position.subtract(prtn.Edge1[1].Position), prtn.Edge1[0].Position, point); var dis2 = GeometryFunctions.DistanceBetweenLineAndVertex( prtn.Edge2[0].Position.subtract(prtn.Edge2[1].Position), prtn.Edge2[0].Position, point); var sum = dis1 + dis2; if (sum < sumDisToEdgs) { sumDisToEdgs = sum; chosenPrtn = prtn; } } return(chosenPrtn); }