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);
        }
示例#3
0
        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);
        }