📄 3_3_8.c
字号:
//计算两个圆交点的程序,当出现两个圆的圆心重合或无交点时,则用return语句跳出,返回主调用函数程序。
void fccp(void) //求两圆的交点(aw1,bw1)
//圆1:圆心(aw1,bw1),半径cw1;圆2:圆心(aw2,bw2),半径cw2
//当前圆弧起点或终点放(freg1.f,freg2.f)
{
aw3=freg1.f;bw3=freg2.f; //暂存当前圆弧起点或终点
freg1.f=aw2-aw1;aw2=freg1.f;
freg2.f=bw2-bw1;bw2=freg2.f;
frr(); //算出A=(aw2-aw1)^2+(bw2-bw1)^2
if (freg1.f==0) //A=0,两圆心重合
{
if (cw1!=cw2)
{ //若两半径不相等,无交点,出错
cut_err_flag=1; //设置出错标记
error();
}
return;
}
cw1=cw1*cw1;
freg2.f=2*freg1.f;
freg2.f=(freg1.f+cw1-cw2*cw2)/freg2.f;
freg1.f=cw1/freg1.f-freg2.f*freg2.f;
fzero(); //判相切,算出D=sqrt((cw1^2-A*M^2)/A)
aw1=aw1+aw2*freg2.f; //算出sx
bw1=bw1+bw2*freg2.f; //算出sy
get_two_point();
}
void fzero(void) //判相切,相切时freg1.f=0
{
if (freg1.f<0)
{
if (freg1.f<-0.1) //两圆无交点,出错
{
error();
}
else freg1.f=0;
}
freg1.f=sqrt(freg1.f);
}
void get_two_point(void) //得到两个交点
{
freg2.f=aw2*freg1.f;
freg1.f=bw2*freg1.f;
aw2=aw1-freg1.f; //得到第二交点的x座标
bw2=bw1+freg2.f; //得到第二交点的y座标
aw1=aw1+freg1.f; //得到第一交点的x座标
bw1=bw1-freg2.f; //得到第一交点的y座标
}
void frr(void) //freg1.f=freg1.f*freg1.f+freg2.f*freg2.f
{
freg1.f=freg1.f*freg1.f+freg2.f*freg2.f;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -