public Align(CsgObject objectToAlign, Face boundingFacesToAlign, Vector3 positionToAlignTo, string name = "") : base(objectToAlign, positionToAlignTo, name) { AxisAlignedBoundingBox bounds = objectToAlign.GetAxisAlignedBoundingBox(); if (IsSet(boundingFacesToAlign, Face.Left, Face.Right)) { positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x; } if (IsSet(boundingFacesToAlign, Face.Right, Face.Left)) { positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x - (bounds.maxXYZ.x - bounds.minXYZ.x); } if (IsSet(boundingFacesToAlign, Face.Front, Face.Back)) { positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y; } if (IsSet(boundingFacesToAlign, Face.Back, Face.Front)) { positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y - (bounds.maxXYZ.y - bounds.minXYZ.y); } if (IsSet(boundingFacesToAlign, Face.Bottom, Face.Top)) { positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z; } if (IsSet(boundingFacesToAlign, Face.Top, Face.Bottom)) { positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z - (bounds.maxXYZ.z - bounds.minXYZ.z); } base.Translation = positionToAlignTo; }
public Align(CsgObject objectToAlign, Face boundingFacesToAlign, Vector3 positionToAlignTo, string name = "") : base(objectToAlign, positionToAlignTo, name) { AxisAlignedBoundingBox bounds = objectToAlign.GetAxisAlignedBoundingBox(); if (IsSet(boundingFacesToAlign, Face.Left, Face.Right)) { positionToAlignTo.X = positionToAlignTo.X - bounds.minXYZ.X; } if (IsSet(boundingFacesToAlign, Face.Right, Face.Left)) { positionToAlignTo.X = positionToAlignTo.X - bounds.minXYZ.X - (bounds.maxXYZ.X - bounds.minXYZ.X); } if (IsSet(boundingFacesToAlign, Face.Front, Face.Back)) { positionToAlignTo.Y = positionToAlignTo.Y - bounds.minXYZ.Y; } if (IsSet(boundingFacesToAlign, Face.Back, Face.Front)) { positionToAlignTo.Y = positionToAlignTo.Y - bounds.minXYZ.Y - (bounds.maxXYZ.Y - bounds.minXYZ.Y); } if (IsSet(boundingFacesToAlign, Face.Bottom, Face.Top)) { positionToAlignTo.Z = positionToAlignTo.Z - bounds.minXYZ.Z; } if (IsSet(boundingFacesToAlign, Face.Top, Face.Bottom)) { positionToAlignTo.Z = positionToAlignTo.Z - bounds.minXYZ.Z - (bounds.maxXYZ.Z - bounds.minXYZ.Z); } base.Translation = positionToAlignTo; }
public Align(CsgObject objectToAlign, Face boundingFacesToAlign, Vector3 positionToAlignTo, string name = "") : base(objectToAlign, positionToAlignTo, name) { AxisAlignedBoundingBox bounds = objectToAlign.GetAxisAlignedBoundingBox(); if (IsSet(boundingFacesToAlign, Face.Left, Face.Right)) { positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x; } if (IsSet(boundingFacesToAlign, Face.Right, Face.Left)) { positionToAlignTo.x = positionToAlignTo.x - bounds.minXYZ.x - (bounds.maxXYZ.x - bounds.minXYZ.x); } if (IsSet(boundingFacesToAlign, Face.Front, Face.Back)) { positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y; } if (IsSet(boundingFacesToAlign, Face.Back, Face.Front)) { positionToAlignTo.y = positionToAlignTo.y - bounds.minXYZ.y - (bounds.maxXYZ.y - bounds.minXYZ.y); } if (IsSet(boundingFacesToAlign, Face.Bottom, Face.Top)) { positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z; } if (IsSet(boundingFacesToAlign, Face.Top, Face.Bottom)) { positionToAlignTo.z = positionToAlignTo.z - bounds.minXYZ.z - (bounds.maxXYZ.z - bounds.minXYZ.z); } base.Translation = positionToAlignTo; }
public static Vector3 GetPositionToAlignTo(CsgObject objectToAlignTo, Face boundingFacesToAlignTo, Vector3 extraOffset) { Vector3 positionToAlignTo = new Vector3(); if (IsSet(boundingFacesToAlignTo, Face.Left, Face.Right)) { positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.x; } if (IsSet(boundingFacesToAlignTo, Face.Right, Face.Left)) { positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.x; } if (IsSet(boundingFacesToAlignTo, Face.Front, Face.Back)) { positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.y; } if (IsSet(boundingFacesToAlignTo, Face.Back, Face.Front)) { positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.y; } if (IsSet(boundingFacesToAlignTo, Face.Bottom, Face.Top)) { positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.z; } if (IsSet(boundingFacesToAlignTo, Face.Top, Face.Bottom)) { positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.z; } return(positionToAlignTo + extraOffset); }
public static CsgObject CreateFillet(CsgObject objectA, Face faceA, CsgObject objectB, Face faceB, double radius, double extraDimension = defaultExtraDimension) { int centralAxis = 0; // we start defaulted to x switch ((Edge)(faceA | faceB)) { case Edge.LeftTop: case Edge.LeftBottom: case Edge.RightTop: case Edge.RightBottom: centralAxis = 1; // y axis break; case Edge.LeftFront: case Edge.LeftBack: case Edge.RightFront: case Edge.RightBack: centralAxis = 2; // z axis break; } AxisAlignedBoundingBox boundsA = objectA.GetAxisAlignedBoundingBox(); AxisAlignedBoundingBox boundsB = objectB.GetAxisAlignedBoundingBox(); double maxMin = Math.Max(boundsA.minXYZ[centralAxis], boundsB.minXYZ[centralAxis]); double minMax = Math.Min(boundsA.maxXYZ[centralAxis], boundsB.maxXYZ[centralAxis]); if (maxMin >= minMax) { throw new ArgumentException("Your two objects must overlap to have a fillet be created."); } Vector3 size = new Vector3(radius, radius, radius); size[centralAxis] = minMax - maxMin; Round newFilletRound = new Round(size); Face faceToGetBevelFor = CsgObject.GetOposite(faceA) | CsgObject.GetOposite(faceB); newFilletRound.RoundEdge((Edge)faceToGetBevelFor, radius, extraDimension); CsgObject newFillet = new SetCenter(newFilletRound, objectA.GetCenter()); newFillet = new Align(newFillet, CsgObject.GetOposite(faceA), objectA, faceA); newFillet = new Align(newFillet, CsgObject.GetOposite(faceB), objectB, faceB); return(newFillet); }
public SetCenter(CsgObject objectToCenter, Vector3 offset, bool onX = true, bool onY = true, bool onZ = true, string name = "") : base(objectToCenter, offset, name) { AxisAlignedBoundingBox bounds = objectToCenter.GetAxisAlignedBoundingBox(); Vector3 center = (bounds.maxXYZ + bounds.minXYZ) / 2; Vector3 origin = Vector3.Zero; // zero out anything we don't want if (onX) { origin.x = offset.x - center.x; } if (onY) { origin.y = offset.y - center.y; } if (onZ) { origin.z = offset.z - center.z; } base.Translation = origin; }
public SetCenter(CsgObject objectToCenter, Vector3 offset, bool onX = true, bool onY = true, bool onZ = true, string name = "") : base(objectToCenter, offset, name) { AxisAlignedBoundingBox bounds = objectToCenter.GetAxisAlignedBoundingBox(); Vector3 center = (bounds.maxXYZ + bounds.minXYZ) / 2; Vector3 origin = Vector3.Zero; // zero out anything we don't want if (onX) { origin.x = offset.x - center.x; } if (onY) { origin.y = offset.y - center.y; } if (onZ) { origin.z = offset.z - center.z; } base.Translation = origin; }
public SetCenter(CsgObject objectToCenter, Vector3 offset, bool onX = true, bool onY = true, bool onZ = true, string name = "") : base(objectToCenter, offset, name) { AxisAlignedBoundingBox bounds = objectToCenter.GetAxisAlignedBoundingBox(); Vector3 center = (bounds.MaxXYZ + bounds.MinXYZ) / 2; Vector3 origin = Vector3.Zero; // zero out anything we don't want if (onX) { origin.X = offset.X - center.X; } if (onY) { origin.Y = offset.Y - center.Y; } if (onZ) { origin.Z = offset.Z - center.Z; } base.Translation = origin; }
public static CsgObject CreateFillet(CsgObject objectA, Face faceA, CsgObject objectB, Face faceB, double radius, double extraDimension = defaultExtraDimension) { int centralAxis = 0; // we start defaulted to x switch ((Edge)(faceA | faceB)) { case Edge.LeftTop: case Edge.LeftBottom: case Edge.RightTop: case Edge.RightBottom: centralAxis = 1; // y axis break; case Edge.LeftFront: case Edge.LeftBack: case Edge.RightFront: case Edge.RightBack: centralAxis = 2; // z axis break; } AxisAlignedBoundingBox boundsA = objectA.GetAxisAlignedBoundingBox(); AxisAlignedBoundingBox boundsB = objectB.GetAxisAlignedBoundingBox(); double maxMin = Math.Max(boundsA.minXYZ[centralAxis], boundsB.minXYZ[centralAxis]); double minMax = Math.Min(boundsA.maxXYZ[centralAxis], boundsB.maxXYZ[centralAxis]); if (maxMin >= minMax) { throw new ArgumentException("Your two objects must overlap to have a fillet be created."); } Vector3 size = new Vector3(radius, radius, radius); size[centralAxis] = minMax - maxMin; Round newFilletRound = new Round(size); Face faceToGetBevelFor = CsgObject.GetOposite(faceA) | CsgObject.GetOposite(faceB); newFilletRound.RoundEdge((Edge)faceToGetBevelFor, radius, extraDimension); CsgObject newFillet = new SetCenter(newFilletRound, objectA.GetCenter()); newFillet = new Align(newFillet, CsgObject.GetOposite(faceA), objectA, faceA); newFillet = new Align(newFillet, CsgObject.GetOposite(faceB), objectB, faceB); return newFillet; }
public override AxisAlignedBoundingBox GetAxisAlignedBoundingBox() { return(AxisAlignedBoundingBox.Intersection(a.GetAxisAlignedBoundingBox(), b.GetAxisAlignedBoundingBox())); }
public override AxisAlignedBoundingBox GetAxisAlignedBoundingBox() { return(primary.GetAxisAlignedBoundingBox()); }
public override AxisAlignedBoundingBox GetAxisAlignedBoundingBox() { AxisAlignedBoundingBox childBounds = objectToTransform.GetAxisAlignedBoundingBox(); return(childBounds.NewTransformed(transform)); }
public static Vector3 GetPositionToAlignTo(CsgObject objectToAlignTo, Face boundingFacesToAlignTo, Vector3 extraOffset) { Vector3 positionToAlignTo = new Vector3(); if (IsSet(boundingFacesToAlignTo, Face.Left, Face.Right)) { positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.x; } if (IsSet(boundingFacesToAlignTo, Face.Right, Face.Left)) { positionToAlignTo.x = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.x; } if (IsSet(boundingFacesToAlignTo, Face.Front, Face.Back)) { positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.y; } if (IsSet(boundingFacesToAlignTo, Face.Back, Face.Front)) { positionToAlignTo.y = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.y; } if (IsSet(boundingFacesToAlignTo, Face.Bottom, Face.Top)) { positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().minXYZ.z; } if (IsSet(boundingFacesToAlignTo, Face.Top, Face.Bottom)) { positionToAlignTo.z = objectToAlignTo.GetAxisAlignedBoundingBox().maxXYZ.z; } return positionToAlignTo + extraOffset; }