/// <summary> /// Geo Arc Constructor: Vertex, Vertex, Vertex (V3) /// The V3 Constructor takes three vertices that the arc must pass through and /// calculates all of the other properties of the arc /// </summary> /// <param name="vertex0">The Starting Vertex</param> /// <param name="middleVertex">The Middle Vertex</param> /// <param name="vertex1">The Ending Vertex</param> public GeoArc(Vertex vertex0, Vertex middleVertex, Vertex vertex1) { // Vertex 0 _vertex0 = vertex0; Vertex0.PropertyChanged += Vertex0OnPropertyChanged; // Middle Vertex _arcMiddleVertex = middleVertex; MiddleVertex.PropertyChanged += MiddleVertexOnPropertyChanged; // Vertex 1 _vertex1 = vertex1; Vertex1.PropertyChanged += Vertex1OnPropertyChanged; // Center Vertex _centerVertex = CalcCenterVertex(Vertex0, MiddleVertex, Vertex1); CenterVertex.PropertyChanged += CenterVertexOnPropertyChanged; // Starting Angle _startAngle = Vector.AngleBetweenVectors( new Vector(CenterVertex, vertex0), UnitVectors.XUnitVector ); // Ending Angle _endAngle = Vector.AngleBetweenVectors( new Vector(CenterVertex, Vertex1), UnitVectors.XUnitVector ); // Total Angle Angle = EndAngle - StartAngle; // Bulge _bulge = Bulge.CalcBulge(Angle); // Radius _radius = GeoMath.Distance(CenterVertex, vertex0); // Geometric Properties Length = CalcLength(); Area = CalcArea(); }
/// <summary> /// The Radius of the Bulge /// </summary> /// <param name="v0">The Stating Vertex</param> /// <param name="v1">The Ending Vertex</param> /// <param name="angle">The Total Angle of the arc</param> /// <returns></returns> public static double Radius(Vertex v0, Vertex v1, double angle) { return(GeoMath.Distance(v0, v1) / (2 * Math.Sin(angle / 2))); }