C++ 求直线与圆/椭圆交点

话说小学数学都忘记了,matlab里列出两个方程solve一下就好了,在c++里还是要把公式推一下的
已知:
直线方程:y=kx+b;
圆方程:(x-c)^2+(y-d)^2=r^2;
double x1,x2,y1,y2;//交点坐标
if(fabs(k*c-d+b)/sqrt(k*k+b*b)
{
x1=(2*c-2*k*(b-d)+sqrt(pow((2*k*(b-d)-2*c),2)-4*(k*k+1)*((b-d)*(b-d)+c*c-r*r)))/(2*k*k+2);
x2=(2*c-2*k*(b-d)-sqrt(pow((2*k*(b-d)-2*c),2)-4*(k*k+1)*((b-d)*(b-d)+c*c-r*r)))/(2*k*k+2);
y1=k1*x1+b1;
y2=k1*x2+b1;
}
椭圆跟直线交点还是用matlab吧:
已知椭圆:倾斜角tt,椭圆中心:x00,y00,长轴2aa,短轴2bb
直线过点:xx,yy,斜率:k0