#include // 获取圆心角的一半
float get_half_circle_angle(float r, float h)
{
if(h>r || h<=0)
{
return 0;
}
float cos_value = (r-h)/r;
return acos(cos_value);
}
// 获取弦长的一半
float get_half_arc(float r, float h)
{
return sqrt(r*r - (r-h)*(r-h));
}
// 获取圆的面积
float get_circle_area(float r)
{
return M_PI*r*r;
}
// 获取弧的面积
float get_arc_area(float r, float h)
{
float half_arc = get_half_arc(r, h);
float circle_angle = 2 * get_half_circle_angle(r, h);
float area = 0.5*circle_angle*r*r-half_arc*sqrt(r*r-half_arc*half_arc);
return area;
}
int main()
{
// 变量定义
float r = 1;
float start = 0, end = 1, middle;
float flag=0, flag1=0, flag2=0, area=0, arc_area=0, arc_area1=0, arc_area2=0;
float ratio;
// 输入比率
printf("please input the ratio:\n");
scanf("%f", &ratio);
getchar();
// 将比率转化为大于1
if(ratio<1){
ratio = 1/ratio;
}
// 获取圆的面积
area = get_circle_area(r);
// 初始化迭代值
middle = (start + end) / 2;
arc_area1 = get_arc_area(r, start);
arc_area2 = get_arc_area(r, end);
if(arc_area1==0)
{
flag1=10000000;
}else{
flag1 = (area-arc_area1)/arc_area1;
}
flag2 = (area-arc_area2)/arc_area2;
// 二分法取值
while(flag1>=ratio && flag2<=ratio){
arc_area = get_arc_area(r, middle);
flag = (area-arc_area)/arc_area;
printf("flag1=%f, flag2=%f, flag=%f, middle=%f\n", flag1, flag2, flag, middle);
if(flag>ratio)
{
if((flag-ratio)<0.0001)
{
break;
}
start = middle;
arc_area1 = get_arc_area(r, start);
flag1 = (area-arc_area1)/arc_area1;
}else{
if((ratio-flag)<0.0001)
{
break;
}
end = middle;
arc_area2 = get_arc_area(r, end);
flag2 = (area-arc_area2)/arc_area2;
}
middle = (start + end) / 2;
}
// 输出结果
printf("arc_area: %f; middle:%f, arc:%f; \n", get_arc_area(r, middle), middle, 2* get_half_arc(r, middle));
return 0;
}