public void TransformToPlane(Plane newPlane) { double eps = 1e-7; if (!PipeDataUtil.Equals(Vec.Dot(newPlane.Z, Plane.Z), 1, eps)) { throw new InvalidOperationException("Cannot transform arc to a new plane"); } if (Vec.Difference(newPlane.Origin, Plane.Origin).Length > eps) { throw new InvalidOperationException("The origins of the planes do not match"); } double angle = Vec.AngleBetween(Plane.X, newPlane.X); if (angle < eps) { return; } if (Vec.Dot(Vec.Cross(Plane.X, newPlane.X), Plane.Z) < 0) { angle *= -1; } Plane = new Plane(Plane.Origin, Plane.X.RotateAbout(Plane.Z, angle), Plane.Y.RotateAbout(Plane.Z, angle)); StartAngle -= angle; EndAngle -= angle; }
public Arc(Vec startPt, Vec endPt, Vec ptOnArc) { Vec midPt1 = Vec.Multiply(Vec.Sum(endPt, ptOnArc), 0.5); Vec midPt2 = Vec.Multiply(Vec.Sum(startPt, ptOnArc), 0.5); Vec seg1 = Vec.Difference(ptOnArc, startPt); Vec seg2 = Vec.Difference(endPt, ptOnArc); Vec planeZ = Vec.Cross(seg1, seg2); Vec rad1 = Vec.Cross(planeZ, seg1); Vec rad2 = Vec.Cross(planeZ, seg2); Vec center = Vec.IntersectLines(midPt1, rad1, midPt2, rad2); Vec planeX = Vec.Difference(startPt, center); Vec planeY = Vec.Cross(planeZ, planeX); _plane = new Plane(center, planeX, planeY, planeZ); _radius = Vec.Difference(center, startPt).Length; _startAngle = 0; _endAngle = 2 * Vec.AngleBetween(rad1, rad2); }