예제 #1
0
        /***************************************************/
        /**** Private Methods                           ****/
        /***************************************************/

        private static void GenerateMapProfiles(ref TheatronFullProfile fullProfile, List <ProfileParameters> parameters, double distToFocalCurve, ProfileOrigin sectionOrigin)
        {
            Point lastpoint = new Point();

            for (int i = 0; i < parameters.Count; i++)
            {
                if (i == 0)
                {
                    parameters[i].StartX = distToFocalCurve + parameters[i].RowWidth - parameters[i].EyePositionParameters.EyePositionX;
                }
                TierProfile tierSection = TierProfile(parameters[i], lastpoint);
                fullProfile.BaseTierProfiles.Add(tierSection);

                if (i == 0)
                {
                    fullProfile.FullProfileOrigin          = fullProfile.BaseTierProfiles[0].SectionOrigin;
                    fullProfile.FullProfileOrigin.Origin.Z = 0;
                }
                Point  source      = fullProfile.FullProfileOrigin.Origin;
                Point  target      = sectionOrigin.Origin;
                double angle       = Math.Atan2(sectionOrigin.Direction.Y, sectionOrigin.Direction.X);
                Vector scaleVector = SetScaleVector(tierSection.SectionOrigin.Direction, tierSection.SectionOrigin, tierSection.SectionOrigin);
                fullProfile.MappedProfiles.Add(TransformProfile(tierSection, scaleVector, source, target, angle));
                lastpoint = tierSection.FloorPoints[tierSection.FloorPoints.Count - 1];
            }
        }
예제 #2
0
        /***************************************************/

        private static void SetBlockProfiles(ref SeatingBlock block, TierProfile sectionToMap, ProfileOrigin origin)
        {
            //first section
            //always mapping from the full profile base plane
            Point  source      = origin.Origin;
            Vector scaleVector = SetScaleVector(sectionToMap.SectionOrigin.Direction, block.Start, block.Vomitory);
            double angle       = Geometry.Query.Angle(origin.Direction, block.Start.Direction, Plane.XY);
            var    start       = TransformProfile(sectionToMap, scaleVector, source, block.Start.Origin, angle);

            block.Sections.Add(start);

            //vomitory section no need for scalefactor
            scaleVector = SetScaleVector(sectionToMap.SectionOrigin.Direction, block.Vomitory, block.Vomitory);
            angle       = Geometry.Query.Angle(origin.Direction, block.Vomitory.Direction, Plane.XY);
            var vom = TransformProfile(sectionToMap, scaleVector, source, block.Vomitory.Origin, angle);

            block.Sections.Add(vom);

            //end section
            scaleVector = SetScaleVector(sectionToMap.SectionOrigin.Direction, block.End, block.Vomitory);
            angle       = Geometry.Query.Angle(origin.Direction, block.End.Direction, Plane.XY);
            var end = TransformProfile(sectionToMap, scaleVector, source, block.End.Origin, angle);

            block.Sections.Add(end);
        }
예제 #3
0
        public static TierProfile TierProfile(ProfileParameters parameters, Point lastPointPrevTier)
        {
            if (parameters == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot create a tier profile from a null set of profile parameters.");
                return(null);
            }

            if (lastPointPrevTier == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot create a tier profile from a null spectator eye point from a previous tier.");
                return(null);
            }

            TierProfile tierProfile = new TierProfile();

            SetEyePoints(ref tierProfile, parameters, lastPointPrevTier.X, lastPointPrevTier.Z);

            SectionSurfPoints(ref tierProfile, parameters);

            tierProfile.SectionOrigin = DefineTierOrigin(tierProfile.FloorPoints);

            tierProfile.Profile = Geometry.Create.Polyline(tierProfile.FloorPoints);

            return(tierProfile);
        }
예제 #4
0
        /***************************************************/
        /**** Private Methods                           ****/
        /***************************************************/

        private static TierProfile MirrorTierYZ(TierProfile originalSection)
        {
            //need a clone
            TierProfile theMappedTier = originalSection.DeepClone();
            double      x, y, z;

            for (var p = 0; p < theMappedTier.FloorPoints.Count; p++)
            {
                x = theMappedTier.FloorPoints[p].X;
                y = -theMappedTier.FloorPoints[p].Y;
                z = theMappedTier.FloorPoints[p].Z;
                theMappedTier.FloorPoints[p] = Geometry.Create.Point(x, y, z);
            }
            for (var p = 0; p < theMappedTier.EyePoints.Count; p++)
            {
                x = theMappedTier.EyePoints[p].X;
                y = -theMappedTier.EyePoints[p].Y;
                z = theMappedTier.EyePoints[p].Z;
                theMappedTier.EyePoints[p] = Geometry.Create.Point(x, y, z);
            }
            theMappedTier.Profile.ControlPoints = theMappedTier.FloorPoints;
            theMappedTier.SectionOrigin         = DefineTierOrigin(theMappedTier.FloorPoints);

            return(theMappedTier);
        }
예제 #5
0
        /***************************************************/

        private static void TransformTier(ref TierProfile profile, TransformMatrix xTrans)
        {
            profile.FloorPoints           = profile.FloorPoints.Select(p => p.Transform(xTrans)).ToList();
            profile.EyePoints             = profile.EyePoints.Select(p => p.Transform(xTrans)).ToList();
            profile.Profile.ControlPoints = profile.FloorPoints;
            profile.FocalPoint            = profile.FocalPoint.Transform(xTrans);
            profile.SectionOrigin         = DefineTierOrigin(profile.FloorPoints);
        }
예제 #6
0
        //this should be a modify method
        public static TierProfile TransformProfile(TierProfile originalSection, Vector scale, Point source, Point target, double angle)
        {
            TierProfile transformedTier = (TierProfile)originalSection.DeepClone();
            var         xScale          = Geometry.Create.ScaleMatrix(source, scale);
            var         xRotate         = Geometry.Create.RotationMatrix(source, Vector.ZAxis, angle);
            var         xTrans          = Geometry.Create.TranslationMatrix(target - source);

            TransformTier(ref transformedTier, xScale);
            TransformTier(ref transformedTier, xRotate);
            TransformTier(ref transformedTier, xTrans);
            return(transformedTier);
        }
예제 #7
0
        /***************************************************/
        private static void SetEyePoints(ref TierProfile tierProfile, ProfileParameters parameters, double lastX, double lastZ)
        {
            double prevX, prevZ;

            for (int i = 0; i < parameters.NumRows; i++)
            {
                double x = 0;
                double y = 0;
                double z = 0;
                if (parameters.SuperRiserParameters.SuperRiser && i == parameters.SuperRiserParameters.SuperRiserStartRow)
                {
                    double deltaSHoriz = parameters.EyePositionParameters.StandingEyePositionX - parameters.EyePositionParameters.EyePositionX;//differences between standing and seated eye posiitons
                    double deltaSVert  = parameters.EyePositionParameters.StandingEyePositionZ - parameters.EyePositionParameters.EyePositionZ;
                    //shift the previous positions to give standing eye position and add in the super riser specific horiznotal
                    prevX = tierProfile.EyePoints[i - 1].X - (deltaSHoriz);
                    prevZ = tierProfile.EyePoints[i - 1].Z + (deltaSVert);
                    x     = prevX + parameters.EyePositionParameters.StandingEyePositionX + parameters.SuperRiserParameters.SuperRiserKerbWidth + parameters.EyePositionParameters.WheelChairEyePositionX;
                    z     = prevZ + parameters.TargetCValue + parameters.RowWidth * ((prevZ + parameters.TargetCValue) / prevX);
                }
                else
                {
                    if (parameters.SuperRiserParameters.SuperRiser && i == parameters.SuperRiserParameters.SuperRiserStartRow + 1)//row after the super riser
                    {
                        //x shifts to include 3 rows for super platform back nib wall nib and row less horiz position
                        //also a wider row is required
                        double widthSp = (2 * parameters.RowWidth) + parameters.SuperRiserParameters.SuperRiserKerbWidth + parameters.RowWidth - parameters.EyePositionParameters.EyePositionX;
                        x = tierProfile.EyePoints[i - 1].X + widthSp;
                        //z is with standard c over the wheel chair posiiton but could be over the handrail
                        z = tierProfile.EyePoints[i - 1].Z + parameters.TargetCValue + widthSp * ((tierProfile.EyePoints[i - 1].Z + parameters.TargetCValue) / tierProfile.EyePoints[i - 1].X);
                    }
                    else
                    {
                        if (i == 0)
                        {
                            x = parameters.StartX + lastX;

                            z = parameters.StartZ + lastZ;
                        }
                        else
                        {
                            x = tierProfile.EyePoints[i - 1].X + parameters.RowWidth;
                            z = tierProfile.EyePoints[i - 1].Z + parameters.TargetCValue + parameters.RowWidth * ((tierProfile.EyePoints[i - 1].Z + parameters.TargetCValue) / tierProfile.EyePoints[i - 1].X);
                        }
                    }
                }
                if (parameters.RiserHeightRounding > 0)
                {
                    z = Math.Round(z / parameters.RiserHeightRounding) * parameters.RiserHeightRounding;
                }
                var p = Geometry.Create.Point(x, y, z);
                tierProfile.EyePoints.Add(p);
            }
        }
예제 #8
0
        public static TierProfile TierProfile(ProfileParameters parameters, Point lastPointPrevTier)
        {
            TierProfile tierProfile = new TierProfile();

            SetEyePoints(ref tierProfile, parameters, lastPointPrevTier.X, lastPointPrevTier.Z);

            SectionSurfPoints(ref tierProfile, parameters);

            tierProfile.SectionOrigin = DefineTierOrigin(tierProfile.FloorPoints);

            tierProfile.Profile = Geometry.Create.Polyline(tierProfile.FloorPoints);

            return(tierProfile);
        }
예제 #9
0
        /***************************************************/

        private static void TransformTier(ref TierProfile profile, TransformMatrix xTrans)
        {
            if (profile == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot modify a null tier profile.");
                return;
            }

            if (xTrans == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot modify a tier profile with a null transformation matrix.");
                return;
            }

            profile.FloorPoints           = profile.FloorPoints.Select(p => p.Transform(xTrans)).ToList();
            profile.EyePoints             = profile.EyePoints.Select(p => p.Transform(xTrans)).ToList();
            profile.Profile.ControlPoints = profile.FloorPoints;
            profile.FocalPoint            = profile.FocalPoint.Transform(xTrans);
            profile.SectionOrigin         = DefineTierOrigin(profile.FloorPoints);
        }
예제 #10
0
        public static TierProfile TransformProfile(TierProfile originalSection, Vector scale, Point source, Point target, double angle)
        {
            if (originalSection == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot modify a null tier profile.");
                return(originalSection);
            }

            if (scale == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot transform a tier profile using a null scale vector.");
                return(originalSection);
            }

            if (source == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot transform a tier profile from a null source point.");
                return(originalSection);
            }

            if (target == null)
            {
                BH.Engine.Reflection.Compute.RecordError("Cannot transform a tier profile from a null target point.");
                return(originalSection);
            }

            TierProfile transformedTier = (TierProfile)originalSection.DeepClone();
            var         xScale          = Geometry.Create.ScaleMatrix(source, scale);
            var         xRotate         = Geometry.Create.RotationMatrix(source, Vector.ZAxis, angle);
            var         xTrans          = Geometry.Create.TranslationMatrix(target - source);

            TransformTier(ref transformedTier, xScale);
            TransformTier(ref transformedTier, xRotate);
            TransformTier(ref transformedTier, xTrans);
            return(transformedTier);
        }
예제 #11
0
        /***************************************************/

        private static void SectionSurfPoints(ref TierProfile tierProfile, ProfileParameters parameters)
        {
            double x = 0; double y = 0; double z = 0;

            Point p;

            for (int i = 0; i < tierProfile.EyePoints.Count; i++)
            {
                if (parameters.SuperRiserParameters.SuperRiser && i == parameters.SuperRiserParameters.SuperRiserStartRow)
                {
                    //4 surface points are needed beneath the wheel chair eye point
                    //p1 x is same as previous
                    z = tierProfile.EyePoints[i - 1].Z - parameters.EyePositionParameters.EyePositionZ + 0.1;//z is previous eye - eyeH + something
                    p = Engine.Geometry.Create.Point(x, y, z);
                    tierProfile.FloorPoints.Add(p);

                    //p2 z is the same a sprevious
                    x = x + parameters.SuperRiserParameters.SuperRiserKerbWidth;
                    p = Geometry.Create.Point(x, y, z);
                    tierProfile.FloorPoints.Add(p);

                    //p3 x is unchanged
                    z = tierProfile.EyePoints[i].Z - parameters.EyePositionParameters.WheelChairEyePositionZ;
                    p = Geometry.Create.Point(x, y, z);
                    tierProfile.FloorPoints.Add(p);

                    //p4 z unchnaged
                    x = x + 3 * parameters.RowWidth;
                    p = Geometry.Create.Point(x, y, z);
                    tierProfile.FloorPoints.Add(p);
                }
                else
                {
                    if (parameters.SuperRiserParameters.SuperRiser && i == parameters.SuperRiserParameters.SuperRiserStartRow + 1)//row after the super riser
                    {
                        //4 surface points are needed beneath the wheel chair eye point
                        //p1 x is same as previous
                        z = tierProfile.EyePoints[i].Z - parameters.EyePositionParameters.EyePositionZ + parameters.BoardHeight;//boardheight is handrail height
                        p = Geometry.Create.Point(x, y, z);
                        tierProfile.FloorPoints.Add(p);

                        //p2 z unchanged
                        x = x + parameters.SuperRiserParameters.SuperRiserKerbWidth;
                        p = Geometry.Create.Point(x, y, z);
                        tierProfile.FloorPoints.Add(p);

                        //p3 x unchanged
                        z = tierProfile.EyePoints[i].Z - parameters.EyePositionParameters.EyePositionZ;
                        p = Geometry.Create.Point(x, y, z);
                        tierProfile.FloorPoints.Add(p);

                        //p4 z unchanged
                        x = tierProfile.EyePoints[i].X + parameters.EyePositionParameters.EyePositionX;
                        p = Geometry.Create.Point(x, y, z);
                        tierProfile.FloorPoints.Add(p);
                    }
                    else
                    {//standard two points per eye
                        for (var j = 0; j < 2; j++)
                        {
                            if (j == 0)
                            {
                                z = tierProfile.EyePoints[i].Z - parameters.EyePositionParameters.EyePositionZ;
                                x = tierProfile.EyePoints[i].X - parameters.RowWidth + parameters.EyePositionParameters.EyePositionX;
                            }
                            else
                            {
                                x = tierProfile.EyePoints[i].X + parameters.EyePositionParameters.EyePositionX;
                            }
                            p = Geometry.Create.Point(x, y, z);
                            tierProfile.FloorPoints.Add(p);
                        }
                    }
                }
            }
        }