For example I can make a box tightly fit around a circle ensuring that the box has
vertical sides and horizontal top and bottom and that the interior angles of the box are 90 degrees.
The declarative code to do this is
[Test()]
public void SquareAroundCircle()
{
var circle = new Circle() { center = new Point(0, 0, false), rad = new Parameter(10, false) };
// We want a box around the circle where all lines touch the
// circle and line0 is vertical. We arrange the lines roughly
// in the correct placement to get the search off to a good
// start
var line0 = new Line(new Point(-21,0), new Point(0, 23));
var line1 = new Line(new Point(0,22), new Point(22, 0));
var line2 = new Line(new Point(21,0), new Point(0, -29));
var line3 = new Line(new Point(0,-27), new Point(-25, 0));
var angle = new Parameter (Math.PI/2, false);
var r = SketchSolve.Solver.solve
( true
, line0.IsTangentTo(circle)
, line1.IsTangentTo(circle)
, line2.IsTangentTo(circle)
, line3.IsTangentTo(circle)
, line0.HasInternalAngle (line1, angle)
, line1.HasInternalAngle(line2, angle)
, line2.HasInternalAngle(line3, angle)
, line3.HasInternalAngle(line0, angle)
, line0.p2.IsColocated(line1.p1)
, line1.p2.IsColocated(line2.p1)
, line2.p2.IsColocated(line3.p1)
, line3.p2.IsColocated(line0.p1)
, line0.IsVertical()
);
Console.WriteLine (line0);
Console.WriteLine (line1);
Console.WriteLine (line2);
Console.WriteLine (line3);
r.Should ().BeApproximately (0, 0.0001);
}
outputs
l -10.0001115077093 ; -10.0000042872393 : -10.0001009643498 ; 10.0007695944268
l -10.0001039993543 ; 10.0007775379925 : 10.000822346198 ; 9.9993514218465
l 10.0008234033545 ; 9.99932555026719 : 9.99938821899412 ; -10.0001897226096
l 9.99938502181062 ; -10.0001965026072 : -10.0001011598745 ; -10.0000102791518
l 0 ; 0 : -10.0001062362285 ; 5.27153176044237E-06
which you should be able to verify is indeed a box tangent to a circle of radius 10
The number of free variables generated by the constraints is 16
If anybody is interested in the implementation of this with Accord.NET you can see
the source code at
under a BSD license and if there are some really nerdy Math types that would
like to suggest better way of doing things or add tests then I'd be really
happy.
Thanks Ceasaro for a neat optimization lib to get me started properly with this
Brad