/***************************************************/ /**** 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]; } }
/***************************************************/ 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); }
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); }
/***************************************************/ /**** 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); }
/***************************************************/ 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); }
//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); }
/***************************************************/ 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); } }
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); }
/***************************************************/ 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); }
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); }
/***************************************************/ 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); } } } } }