//====================================================================// // Variante 3: Crea un Arco usando 2 puntos y un angulo // [Start, Center, angleAgudo] //====================================================================// public ArcEx(StartPointEx start, CenterPointEx center, GradeAngleEx angleEx, Vector3d normal, bool inverseFocus = false) { PointType pC, P1, P2; double hipo, s_Ang, e_Ang; // Paso 1: Normalizo el valor del angulo y compruebo su signo. angleEx.val = is2GraphObj.NormalizeAngle(angleEx.val); if (is2GraphObj.isNegative(angleEx.val) && inverseFocus == false) { inverseFocus = true; } else if (inverseFocus && is2GraphObj.isPositive(angleEx.val)) { angleEx.val *= -1; } else { inverseFocus = false; angleEx.val = Math.Abs(angleEx.val); } // Paso 2: Calculo la posicion del punto "End" a partir de los datos conocidos // de los puntos "Center" y "Start", y el angulo especificado. P1 = is2GraphTranslator.Tois2Graph(start.val); pC = is2GraphTranslator.Tois2Graph(center.val); P2 = is2GraphObj.RotatePoint(P1, angleEx.val, pC); // Paso 3: Se calculo el radio del arco. hipo = is2GraphObj.PointPointDistance(pC, P1); // Paso 4: Se calculan los valores en radianes de Inicio Y Fin del arco. s_Ang = is2GraphObj.GradToRad(is2GraphObj.PointPointAngle(pC, P1)); e_Ang = is2GraphObj.GradToRad(is2GraphObj.PointPointAngle(pC, P2)); if (inverseFocus) { is2GraphObj.SwapValue(ref s_Ang, ref e_Ang); } // Paso 5 y Final: Seteo las propiedades heredadas de la clase padre 'Arc'. Center = is2GraphTranslator.ToAcad_3d(pC); StartAngle = s_Ang; EndAngle = e_Ang; Normal = normal; Radius = hipo; Thickness = 0.0; }
//====================================================================// // Variante 5: Crea un Angulo usando [Start, End, angleEx] //====================================================================// public ArcEx(StartPointEx start, EndPointEx end, GradeAngleEx angleEx, Vector3d normal, bool inverseFocus = false) { CircleType C1, C2; ArcDirection direction; PointType pC, P1, P2, midP1_2, P3, P4, pivote = null; double dist, hipo, cateL, angEjeRadial, s_Ang, e_Ang; // Paso 1: Normalizo el valor del angulo y compruebo su signo. angleEx.val = is2GraphObj.NormalizeAngle(angleEx.val); if (is2GraphObj.isNegative(angleEx.val)) { angleEx.val *= -1; inverseFocus = !inverseFocus; } direction = GetArcDirection_2P(start.val, end.val); // Paso 2: Determinar distancia entre "Start" y "End" y el punto medio entre ambos. P1 = is2GraphTranslator.Tois2Graph(start.val); P2 = is2GraphTranslator.Tois2Graph(end.val); dist = is2GraphObj.PointPointDistance(P1, P2); midP1_2 = is2GraphObj.MidPointBetweenPoint(P1, P2); // Paso 3: Se determinan 2 puntos (P3 y P4) en el EJE RADIAL, creando dos circunferencias // auxiliares con centro en 'P2' y 'P2', respectivamente y radio 'radio'. C1 = new CircleType(P1, dist); C2 = new CircleType(P2, dist); is2GraphObj.CircleCircleIntercept(C1, C2, out P3, out P4); // Paso 4: Una vez obtenido los dos puntos del eje Radial. Se determina // cual de los dos puntos se usara para traza la linea sobre // la que se halla el CENTRO del arco. // Esto se halla usando la siguiente Estrategia: if (direction == ArcDirection.AntiHorario) { // Si los puntos del eje radial (P3, P4) tienen la misma 'X', y de los puntos // de entrada P2 tiene mayor 'X' que P2 ---> entonces tomar el Punto del eje // Radial de menor 'Y'. if (P3.cX.Equals(P4.cX) && P1.cX > P2.cX) { pivote = (P3.cY < P4.cY) ? P3 : P4; } // Si los puntos del eje radial (P3, P4) tienen la misma 'X', y de los puntos // de entrada P2 tiene menor 'X' que P2 ---> entonces tomar el Punto del eje // Radial con mayor 'Y'. if (P3.cX.Equals(P4.cX) && P1.cX < P2.cX) { pivote = (P3.cY > P4.cY) ? P3 : P4; } // Si los puntos del eje radial (P3, P4) tienen la misma 'Y', y de los puntos // de entrada P2 tiene menor 'Y' que P2 ---> entonces tomar el Punto del eje // Radial con menor 'X'. if (P3.cY.Equals(P4.cY) && P1.cY < P2.cY) { pivote = (P3.cX < P4.cX) ? P3 : P4; } // Si los puntos del eje radial (P3, P4) tienen la misma 'Y', y de los puntos // de entrada P2 tiene mayor 'Y' que P2 ---> entonces tomar el Punto del eje // Radial con mayor 'X'. if (P3.cY.Equals(P4.cY) && P1.cY > P2.cY) { pivote = (P3.cX > P4.cX) ? P3 : P4; } // Si los puntos de Eje Radial (P3 y P4) son distintos tanto en la 'X' // como en la 'Y', se usan entonces para el analisis los puntos del Eje // Central. Por lo tanto: // Si de los puntos del Eje Central P2 tiene mayor 'X' y menor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con menor 'X'. if (P1.cX > P2.cX && P1.cY < P2.cY) { pivote = (P3.cX < P4.cX) ? P3 : P4; } // Si de los puntos del Eje Central P2 tiene mayor 'X' y mayor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con mayor 'X'. if (P1.cX > P2.cX && P1.cY > P2.cY) { pivote = (P3.cX > P4.cX) ? P3 : P4; } // Si de los puntos del Eje Central P2 tiene menor 'X' y mayor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con mayor 'X'. if (P1.cX < P2.cX && P1.cY > P2.cY) { pivote = (P3.cX > P4.cX) ? P3 : P4; } // Si de los puntos del Eje Central P2 tiene menor 'X' y menor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con menor 'X'. if (P1.cX < P2.cX && P1.cY < P2.cY) { pivote = (P3.cX < P4.cX) ? P3 : P4; } } else { // Si los puntos del eje radial (P3, P4) tienen la misma 'X', y de los puntos // de entrada P2 tiene menor 'X' que P2 ---> entonces tomar el Punto del eje // Radial de mayor 'Y'. if (P3.cX.Equals(P4.cX) && P1.cX < P2.cX) { pivote = (P3.cY > P4.cY) ? P3 : P4; } // Si los puntos del eje radial (P3, P4) tienen la misma 'X', y de los puntos // de entrada P2 tiene mayor 'X' que P2 ---> entonces tomar el Punto del eje // Radial con menor 'Y'. if (P3.cX.Equals(P4.cX) && P1.cX > P2.cX) { pivote = (P3.cY < P4.cY) ? P3 : P4; } // Si los puntos del eje radial (P3, P4) tienen la misma 'Y', y de los puntos // de entrada P2 tiene mayor 'Y' que P2 ---> entonces tomar el Punto del eje // Radial con mayor 'X'. if (P3.cY.Equals(P4.cY) && P1.cY > P2.cY) { pivote = (P3.cX > P4.cX) ? P3 : P4; } // Si los puntos del eje radial (P3, P4) tienen la misma 'Y', y de los puntos // de entrada P2 tiene menor 'Y' que P2 ---> entonces tomar el Punto del eje // Radial con menor 'X'. if (P3.cY.Equals(P4.cY) && P1.cY < P2.cY) { pivote = (P3.cX < P4.cX) ? P3 : P4; } // Si los puntos de Eje Radial (P3 y P4) son distintos tanto en la 'X' // como en la 'Y', se usan entonces para el analisis los puntos del Eje // Central. Por lo tanto: // Si de los puntos del Eje Central P2 tiene menor 'X' y mayor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con mayor 'X'. if (P1.cX < P2.cX && P1.cY > P2.cY) { pivote = (P3.cX > P4.cX) ? P3 : P4; } // Si de los puntos del Eje Central P2 tiene menor 'X' y menor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con menor 'X'. if (P1.cX < P2.cX && P1.cY < P2.cY) { pivote = (P3.cX < P4.cX) ? P3 : P4; } // Si de los puntos del Eje Central P2 tiene mayor 'X' y menor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con menor 'X'. if (P1.cX > P2.cX && P1.cY < P2.cY) { pivote = (P3.cX < P4.cX) ? P3 : P4; } // Si de los puntos del Eje Central P2 tiene mayor 'X' y mayor 'Y' que P2, // ---> entonces tomar el Punto del eje Radial con mayor 'X'. if (P1.cX > P2.cX && P1.cY > P2.cY) { pivote = (P3.cX > P4.cX) ? P3 : P4; } } if (inverseFocus) { pivote = (is2GraphObj.isEqualPoint(pivote, P3)) ? P4 : P3; } // Paso 5: Se calculan datos dimensionales de las construcciones auxiliares // a) Angulo del Eje Radial angEjeRadial = is2GraphObj.PointPointAngle(midP1_2, pivote); // b) La Hipotenuza y Cateto-Largo del Triangulo rectangulo en 'midP' hipo = (dist / 2.0) / Math.Sin(angleEx.ToRadian / 2.0); cateL = Math.Sqrt(Math.Pow(hipo, 2) - Math.Pow((dist / 2.0), 2)); // Paso 6: Se calcula el Punto Centro del arco a construir. pC = is2GraphObj.PolarPoint(midP1_2, angEjeRadial, cateL); // a) Calculo los valores en radianes de Inicio Y Fin del arco // usando para el calculo el Angulo opuesto al angulo del eje // radial. s_Ang = is2GraphObj.GradToRad(is2GraphObj.PointPointAngle(pC, P1)); e_Ang = is2GraphObj.GradToRad(is2GraphObj.PointPointAngle(pC, P2)); if (inverseFocus) { is2GraphObj.SwapValue(ref s_Ang, ref e_Ang); } // Paso 7 y Final: Seteo las propiedades heredadas de la clase padre 'Arc'. Center = is2GraphTranslator.ToAcad_3d(pC); StartAngle = s_Ang; EndAngle = e_Ang; Normal = normal; Radius = hipo; Thickness = 0.0; }