求一个算发:
    一条直线和圆的交点坐标,圆是可以移动的.

解决方案 »

  1.   

    //参考如下代码private double PointToAngle(Point AOrigin, Point APoint) // 取得两点的角度
    {
        if (APoint.X == AOrigin.X)
            if (APoint.Y > AOrigin.Y)
                return Math.PI * 0.5;
            else return Math.PI * 1.5;
        else if (APoint.Y == AOrigin.Y)
            if (APoint.X > AOrigin.X)
                return 0;
            else return Math.PI;
        else
        {
            double Result = Math.Atan((double)(AOrigin.Y - APoint.Y) /
                (AOrigin.X - APoint.X));
            if ((APoint.X < AOrigin.X) && (APoint.Y > AOrigin.Y))
                return Result + Math.PI;
            else if ((APoint.X < AOrigin.X) && (APoint.Y < AOrigin.Y))
                return Result + Math.PI;
            else if ((APoint.X > AOrigin.X) && (APoint.Y < AOrigin.Y))
                return Result + 2 * Math.PI;
            else return Result;
        }
    } /* PointToAngle *///求圆外一点到圆心的直线与圆的交点
    private Point PointXCircle(Point APoint, Point AOrigin, int ARadial)
    {                         //圆外一点     圆心坐标    半径
        double vAngle = PointToAngle(AOrigin, APoint);
        return new Point((int)(AOrigin.X + Math.Cos(vAngle) * ARadial),
            (int)(AOrigin.Y + Math.Sin(vAngle) * ARadial));
    }private void button1_Click(object sender, EventArgs e)
    {
        Random vRandom = new Random();
        int vRadialA = vRandom.Next(100);
        Rectangle vRectangleA = new Rectangle(
            vRandom.Next(ClientSize.Width),
            vRandom.Next(ClientSize.Height),
            vRadialA * 2, vRadialA * 2);
        int vRadialB = vRandom.Next(100);
        Rectangle vRectangleB = new Rectangle(
            vRandom.Next(ClientSize.Width),
            vRandom.Next(ClientSize.Height),
            vRadialB * 2, vRadialB * 2);
        Graphics vGraphics = CreateGraphics();
        vGraphics.DrawEllipse(Pens.Red, vRectangleA);
        vGraphics.DrawEllipse(Pens.Green, vRectangleB);
        Point vCenterA = vRectangleA.Location;
        vCenterA.Offset(vRectangleA.Width / 2, vRectangleA.Height / 2);
        Point vCenterB = vRectangleB.Location;
        vCenterB.Offset(vRectangleB.Width / 2, vRectangleB.Height / 2);
        Point vFringeA =
            PointXCircle(vCenterA, vCenterB, vRadialB);
        Point vFringeB =
            PointXCircle(vCenterB, vCenterA, vRadialA);
        vGraphics.DrawLine(Pens.Blue, vFringeA, vFringeB);
        vGraphics.Dispose();
    }