⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3_3_8.c

📁 51事例原代码 事例多多 应该对初学者很有用
💻 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 + -