//
PcbGraph is picturebox control
//
PcbGraphPaint is picturebox paint event
private void PcbGraphPaint(object sender, PaintEventArgs e)
{
e.Graphics.DrawLine(new Pen(Color.Black), new PointF(0, (pcbGraph.Height/2F)), new PointF(pcbGraph.Width, (pcbGraph.Height/2F)));
var centerPoint = new PointF((pcbGraph.Width/2F), (pcbGraph.Height/2F));
PointF p1;
PointF p2;
var value = FindCircleCircleIntersections(0, (pcbGraph.Height/2F), (pcbGraph.Width), pcbGraph.Width, (pcbGraph.Height/2F), (pcbGraph.Width), out p1, out p2);
if (value != 2) return;
e.Graphics.DrawLine(new Pen(Color.Black), centerPoint, p1);
e.Graphics.DrawLine(new Pen(Color.Black), centerPoint, p2);
}
private int FindCircleCircleIntersections(float cx0, float cy0, float radius0, float cx1, float cy1, float radius1, out PointF intersection1, out PointF intersection2)
{
float dx = cx0 - cx1;
float dy = cy0 - cy1;
double dist = Math.Sqrt(dx*dx + dy*dy);
if (dist > radius0 + radius1)
{
intersection1 = new PointF(float.NaN, float.NaN);
intersection2 = new PointF(float.NaN, float.NaN);
return 0;
}
if (dist < Math.Abs(radius0 - radius1))
{
intersection1 = new PointF(float.NaN, float.NaN);
intersection2 = new PointF(float.NaN, float.NaN);
return 0;
}
if ((dist == 0) && (radius0 == radius1))
{
intersection1 = new PointF(float.NaN, float.NaN);
intersection2 = new PointF(float.NaN, float.NaN);
return 0;
}
double a = (radius0*radius0 - radius1*radius1 + dist*dist)/(2*dist);
double h = Math.Sqrt(radius0*radius0 - a*a);
double cx2 = cx0 + a*(cx1 - cx0)/dist;
double cy2 = cy0 + a*(cy1 - cy0)/dist;
intersection1 = new PointF((float) (cx2 + h*(cy1 - cy0)/dist), (float) (cy2 - h*(cx1 - cx0)/dist));
intersection2 = new PointF((float) (cx2 - h*(cy1 - cy0)/dist), (float) (cy2 + h*(cx1 - cx0)/dist));
if (dist == radius0 + radius1) return 1;
return 2;
}