private Polyline Join(Arc arc, Line line1, Line line2, Tolerance tolerance)
{
var plane = arc.GetPlane();
if (!(plane.IsOn(line1.StartPoint) && plane.IsOn(line1.EndPoint) &&
plane.IsOn(line2.StartPoint) && plane.IsOn(line2.EndPoint)))
return null;
Point2d p0, p3;
var p1 = arc.StartPoint.Convert2d(plane);
var p2 = arc.EndPoint.Convert2d(plane);
var start1 = line1.StartPoint.Convert2d(plane);
var end1 = line1.EndPoint.Convert2d(plane);
var start2 = line2.StartPoint.Convert2d(plane);
var end2 = line2.EndPoint.Convert2d(plane);
if (start1.IsEqualTo(p1, tolerance))
{
p0 = end1;
if (start2.IsEqualTo(p2, tolerance)) p3 = end2;
else if (end2.IsEqualTo(p2, tolerance)) p3 = start2;
else return null;
}
else if (end1.IsEqualTo(p1, tolerance))
{
p0 = start1;
if (start2.IsEqualTo(p2, tolerance)) p3 = end2;
else if (end2.IsEqualTo(p2, tolerance)) p3 = start2;
else return null;
}
else if (start2.IsEqualTo(p1, tolerance))
{
p0 = end2;
if (start1.IsEqualTo(p2, tolerance)) p3 = end1;
else if (end1.IsEqualTo(p2, tolerance)) p3 = start1;
else return null;
}
else if (end2.IsEqualTo(p1, tolerance))
{
p0 = line2.StartPoint.Convert2d(plane);
if (start1.IsEqualTo(p2, tolerance)) p3 = end1;
else if (end1.IsEqualTo(p2, tolerance)) p3 = start1;
else return null;
}
else
{
return null;
}
var angle = arc.EndAngle - arc.StartAngle;
if (angle < 0)
angle += Math.PI * 2.0;
double bulge = Math.Tan(angle / 4.0);
Polyline pline
= new Polyline
(4); pline.AddVertexAt(0, p0, 0.0, 0.0, 0.0);
pline.AddVertexAt(1, p1, bulge, 0.0, 0.0);
pline.AddVertexAt(2, p2, 0.0, 0.0, 0.0);
pline.AddVertexAt(3, p3, 0.0, 0.0, 0.0);
pline.Normal = arc.Normal;
pline.TransformBy(Matrix3d.Displacement(arc.Center.GetAsVector()));
return pline;
}