//====================================================================// // Variante 2: Crea un Arco usando 3 puntos [Start, Center, End] //====================================================================// public ArcEx(StartPointEx start, CenterPointEx center, EndPointEx end, Vector3d normal, bool inverseFocus = false) { PointType P1, P2, pC; double hipo, s_Ang, e_Ang; P1 = is2GraphTranslator.Tois2Graph(start.val); P2 = is2GraphTranslator.Tois2Graph(end.val); pC = is2GraphTranslator.Tois2Graph(center.val); // Paso 1: Determinar distancia entre "Start" y "Center". hipo = is2GraphObj.PointPointDistance(pC, P1); // b) 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 2 y Final: Seteo las propiedades heredadas de la clase padre 'Arc'. Center = center.val; StartAngle = s_Ang; EndAngle = e_Ang; Normal = normal; Radius = hipo; Thickness = 0.0; }
//====================================================================// // Variante 1: Crea un Arco usando 3 puntos [Start, Mid, End] //====================================================================// public ArcEx(StartPointEx start, AnyPointEx any, EndPointEx end, Vector3d normal) { LineType L1, L2; SegmentType S1, S2; ArcDirection direction; PointType pC, P1, P2, Px; double hipo, s_Ang, e_Ang; // Paso 1: Creo dos mediatrices sobre los segmentos S1 y S2. // Estas 2 bisectrices se cortan sobre el centro del arco. P1 = is2GraphTranslator.Tois2Graph(start.val); P2 = is2GraphTranslator.Tois2Graph(end.val); Px = is2GraphTranslator.Tois2Graph(any.val); S1 = new SegmentType(P1, Px); S2 = new SegmentType(Px, P2); L1 = is2GraphObj.PerperdicularLineAt(S1.ConvertToLine(), S1.MidPoint); L2 = is2GraphObj.PerperdicularLineAt(S2.ConvertToLine(), S2.MidPoint); is2GraphObj.LineLineIntercept(L1, L2, out pC); // Paso 2: Determinar distancia entre "P1" y "pC", que es el radio del arco. hipo = is2GraphObj.PointPointDistance(pC, P1); // b) Calculo 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)); direction = GetArcDirection_3P(start.val, any.val, end.val); if (direction == ArcDirection.Horario) { is2GraphObj.SwapValue(ref s_Ang, ref e_Ang); } // Paso 3 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 11-B: Crea un Arco continuo usando el punto final de un // arco anterior como punto de inicio del nuevo arco y un punto final // cualquiera. // [Start_continuos from Arc] //====================================================================// public ArcEx(StartPointEx start, EndPointEx end, ArcEx Arc, Vector3d normal, bool inverseFocus = false) { }
//====================================================================// // Variante 7: Crea un Arco usando 2 puntos y radio [Start, Center, ArcRadius] //====================================================================// public ArcEx(StartPointEx start, EndPointEx end, RadiusEx radiusEx, 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; direction = GetArcDirection_2P(start.val, end.val); // Paso 1: 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); // Se lanza una exception si el arco es invalido. if (is2GraphObj.MenorEstricto(radiusEx.val, dist / 2.0)) { throw new ArcException("ArcEx Class: No se puede obtener un arco con el valor de radio dado."); } // Paso 2: 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 3: 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 (is2GraphObj.isEqualValues(P3.cX, 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 (is2GraphObj.isEqualValues(P3.cX, 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 (is2GraphObj.isEqualValues(P3.cY, 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 (is2GraphObj.isEqualValues(P3.cY, 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 (is2GraphObj.isEqualValues(P3.cX, 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 (is2GraphObj.isEqualValues(P3.cX, 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 (is2GraphObj.isEqualValues(P3.cY, 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 (is2GraphObj.isEqualValues(P3.cY, 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 4: 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 = radiusEx.val; cateL = Math.Sqrt(Math.Pow(hipo, 2) - Math.Pow((dist / 2.0), 2)); // Paso 5: 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)); // Paso 6 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; }