public void TangentLineToCircle() { var sketch = Sketch.Create(); var p1 = sketch.AddPoint(new Pnt2d(-20, 0)); var p2 = sketch.AddPoint(new Pnt2d(20, 30)); var line = new SketchSegmentLine(p1, p2); var s1 = sketch.AddSegment(line); var cp1 = sketch.AddPoint(new Pnt2d(0, 0)); var cp2 = sketch.AddPoint(new Pnt2d(0, 10)); var circ = new SketchSegmentCircle(cp1, cp2); var s2 = sketch.AddSegment(circ); var c1 = sketch.AddConstraint(new SketchConstraintTangent(s1, s2)); Assert.IsTrue(sketch.SolveConstraints(true)); var intersec = new IntAna2d_AnaIntersection(line.GetLine(sketch.Points), circ.GetCircle(sketch.Points)); Assert.IsTrue(intersec.IsDone()); if (intersec.NbPoints() > 1) { Assert.AreEqual(0.0, intersec.Point(1).Value().Distance(intersec.Point(2).Value()), MaxLengthDelta); } }
//-------------------------------------------------------------------------------------------------- public override bool MakeConstraint(Dictionary <int, Pnt2d> points, Dictionary <int, SketchSegment> segments, SketchConstraintSolver solver) { var lineSegment1 = segments[Segments[0]] as SketchSegmentLine; if (lineSegment1 == null) { return(false); } var lineSegment2 = segments[Segments[1]] as SketchSegmentLine; if (lineSegment2 == null) { return(false); } // Find intersetion point to sort line directions var lin2d1 = lineSegment1.GetLine(points); var lin2d2 = lineSegment2.GetLine(points); if (lin2d1 == null || lin2d2 == null) { return(false); } var intersection = new IntAna2d_AnaIntersection(lin2d1, lin2d2); if (!intersection.IsDone() || intersection.IdenticalElements() || intersection.ParallelElements() || intersection.NbPoints() == 0) { return(false); } var intPnt = intersection.Point(1).Value(); bool reverse1 = intPnt.SquareDistance(lin2d1.Location()) > intPnt.SquareDistance(lin2d1.Location().Translated(lin2d1.Direction().ToVec())); bool reverse2 = intPnt.SquareDistance(lin2d2.Location()) > intPnt.SquareDistance(lin2d2.Location().Translated(lin2d2.Direction().ToVec())); // Create constraint bool valid = true; var con = new Constraint { Type = ConstraintType.InternalAngle }; valid &= solver.SetLine(ref con.Line1, lineSegment1.Points[reverse1 ? 1 : 0], lineSegment1.Points[reverse1 ? 0 : 1], false, false); valid &= solver.SetLine(ref con.Line2, lineSegment2.Points[reverse2 ? 1 : 0], lineSegment2.Points[reverse2 ? 0 : 1], false, false); valid &= solver.SetParameter(out con.Parameter, Angle.ToRad(), true); if (valid) { solver.AddConstraint(con); } return(valid); }
//-------------------------------------------------------------------------------------------------- public static List <SketchConstraint> Create(Sketch sketch, List <int> points, List <int> segments) { var list = new List <SketchConstraint>(); for (int i = 0; i < segments.Count - 1; i++) { var lin2d1 = (sketch.Segments[segments[i]] as SketchSegmentLine)?.GetLine(sketch.Points); var lin2d2 = (sketch.Segments[segments[i + 1]] as SketchSegmentLine)?.GetLine(sketch.Points); if (lin2d1 == null || lin2d2 == null) { continue; } // Find intersetion point to sort line directions var intersection = new IntAna2d_AnaIntersection(lin2d1, lin2d2); if (!intersection.IsDone() || intersection.IdenticalElements() || intersection.ParallelElements() || intersection.NbPoints() == 0) { continue; } var intPnt = intersection.Point(1).Value(); if (intPnt.SquareDistance(lin2d1.Location()) > intPnt.SquareDistance(lin2d1.Location().Translated(lin2d1.Direction().ToVec()))) { lin2d1 = lin2d1.Reversed(); } if (intPnt.SquareDistance(lin2d2.Location()) > intPnt.SquareDistance(lin2d2.Location().Translated(lin2d2.Direction().ToVec()))) { lin2d2 = lin2d2.Reversed(); } // Get angle var angle = lin2d1.Angle(lin2d2).ToDeg().Abs(); if (angle > 0) { list.Add(new SketchConstraintAngle(segments[i], segments[i + 1], angle)); } } return(list); }