public AxeSecondProps CloneNegateZ() { AxeSecondProps retVal = UtilityCore.Clone_Shallow(this); retVal.EndTL = new Point3D(retVal.EndTL.X, retVal.EndTL.Y, retVal.EndTL.Z * -1); retVal.EndTR = new Point3D(retVal.EndTR.X, retVal.EndTR.Y, retVal.EndTR.Z * -1); retVal.EndBR = new Point3D(retVal.EndBR.X, retVal.EndBR.Y, retVal.EndBR.Z * -1); retVal.EndBL_1 = new Point3D(retVal.EndBL_1.X, retVal.EndBL_1.Y, retVal.EndBL_1.Z * -1); if (retVal.EndBL_2 != null) { retVal.EndBL_2 = new Point3D(retVal.EndBL_2.Value.X, retVal.EndBL_2.Value.Y, retVal.EndBL_2.Value.Z * -1); } return(retVal); }
private static BezierSegment3D[][] GetModel_Second_Curves(AxeSecondProps arg) { BezierSegment3D[][] retVal = new BezierSegment3D[5][]; AxeSecondProps[] argLevels = new AxeSecondProps[5]; argLevels[2] = arg; // Edge #region Middle argLevels[1] = UtilityCore.Clone_Shallow(arg); // Right argLevels[1].EndTR = new Point3D(argLevels[1].EndTR.X * .8, argLevels[1].EndTR.Y * .9, .15); Vector3D offsetTR = new Point3D(argLevels[1].EndTR.X, argLevels[1].EndTR.Y, 0) - arg.EndTR; Quaternion angleTR = Math3D.GetRotation((arg.EndTL - arg.EndTR), offsetTR); Vector3D rotated = (arg.EndBL_1 - arg.EndBR).ToUnit() * offsetTR.Length; rotated = rotated.GetRotatedVector(angleTR.Axis, angleTR.Angle * -1.3); argLevels[1].EndBR = new Point3D(argLevels[1].EndBR.X + rotated.X, argLevels[1].EndBR.Y + rotated.Y, .15); // can't just use percents of coordinates. Instead use the same offset angle,distance that top left had // Left argLevels[1].EndTL = new Point3D(argLevels[1].EndTL.X, argLevels[1].EndTL.Y * .95, .3); if (argLevels[1].EndBL_2 == null) { argLevels[1].EndBL_1 = new Point3D(argLevels[1].EndBL_1.X, argLevels[1].EndBL_1.Y * .9, .3); } else { Vector3D offsetBL1 = arg.EndBR - arg.EndBL_1; double lengthBL1 = (new Point3D(argLevels[1].EndBR.X, argLevels[1].EndBR.Y, 0) - arg.EndBR).Length; offsetBL1 = offsetBL1.ToUnit() * (offsetBL1.Length - lengthBL1); argLevels[1].EndBL_1 = argLevels[1].EndBR - offsetBL1; argLevels[1].EndBL_1 = new Point3D(argLevels[1].EndBL_1.X, argLevels[1].EndBL_1.Y, .18); argLevels[1].EndBL_2 = new Point3D(argLevels[1].EndBL_2.Value.X, argLevels[1].EndBL_2.Value.Y * .9, .3); } argLevels[3] = argLevels[1].CloneNegateZ(); #endregion #region Far argLevels[0] = UtilityCore.Clone_Shallow(arg); argLevels[0].EndTL = new Point3D(argLevels[0].EndTL.X, argLevels[0].EndTL.Y * .7, .4); argLevels[0].EndTR = new Point3D(argLevels[0].EndTR.X * .5, argLevels[0].EndTR.Y * .6, .25); if (argLevels[0].EndBL_2 == null) { argLevels[0].EndBR = new Point3D(argLevels[0].EndBR.X * .5, argLevels[0].EndBR.Y * .6, .25); argLevels[0].EndBL_1 = new Point3D(argLevels[0].EndBL_1.X, argLevels[0].EndBL_1.Y * .6, .4); } else { // Bottom Right Vector3D offset = (argLevels[1].EndBR - argLevels[1].EndBL_1) * .5; Point3D startPoint = argLevels[1].EndBL_1 + offset; // midway along bottom edge offset = argLevels[1].EndTR - startPoint; argLevels[0].EndBR = startPoint + (offset * .15); // from midway point toward upper right point argLevels[0].EndBR = new Point3D(argLevels[0].EndBR.X, argLevels[0].EndBR.Y, .25); // fix z // Left of bottom right (where the circle cutout ends) offset = argLevels[1].EndBR - argLevels[1].EndBL_1; argLevels[0].EndBL_1 = Math3D.GetClosestPoint_Line_Point(argLevels[0].EndBR, offset, argLevels[0].EndBL_1); offset *= .05; Point3D minBL1 = argLevels[0].EndBR - offset; Vector3D testOffset = argLevels[0].EndBL_1 - argLevels[0].EndBR; if (Vector3D.DotProduct(testOffset, offset) < 0 || testOffset.LengthSquared < offset.LengthSquared) { argLevels[0].EndBL_1 = minBL1; } // Bottom Left argLevels[0].EndBL_2 = new Point3D(argLevels[0].EndBL_2.Value.X, argLevels[0].EndBL_2.Value.Y * .6, .4); // Reduce the curve a bit argLevels[0].B2AngleL = argLevels[0].B2AngleL * .9; argLevels[0].B2PercentL = argLevels[0].B2PercentL * .95; argLevels[0].B2AngleR = argLevels[0].B2AngleR * .85; argLevels[0].B2PercentR = argLevels[0].B2PercentR * .95; } argLevels[4] = argLevels[0].CloneNegateZ(); #endregion for (int cntr = 0; cntr < 5; cntr++) { BezierSegment3D[] segments = GetModel_Second_Segments(argLevels[cntr]); retVal[cntr] = segments; } return(retVal); }