#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double chordangle(double r,double a)
{
double x = a/2.0;
do{
x = ((x * r * r / M_PI) - (sin(x) * r * r / 2.0) - a ) /
(r * r / M_PI - (r * r / 2.0) * cos(x));
}while(((x * r * r / M_PI) - (sin(x) * r * r / 2.0 ) - a) > 1e-11);
return x;
}
int main()
{
double a,r;
printf("Enter radius: ");
if(scanf("%lf",&r)!=1)
{
printf("You must enter a number.\n");
exit(1);
}
printf("Enter desired area of slice: ");
if(scanf("%lf",&a)!=1)
{
printf("You must enter a number.\n");
exit(1);
}
printf("The angle in radians is %lf.\n",chordangle(r,a));
printf("The angle in degrees is %lf.\n",chordangle(r,a)*180.0/M_PI);
return 0;
}
2 回答
这是牛顿方法的一个很好的应用 . 可以轻松修改以下C程序以解决问题 . 您可以将其更改为以圆的面积百分比计算所需面积,或单独计算所需面积并输入 .
我已经更新了这个答案(原文是在最底层) .
您已经知道圆的半径,它的面积(PI * r平方)和您要构建的线段的面积(smallerPercentage / 100 * areaOfCircle) .
如果我正确理解了问题,则没有公式可以计算出创建给定区域和半径的段所需的角度 .
然而,一切都不会丢失 .
如果您知道角度,您也可以使用已有的公式计算出该区域 . A = 0.5 * r的平方*(((PI / 180)*Θ) - sin(Θ))其中θ是角度 .
因此,唯一的解决方案是开始在Θ处进行有条理的猜测,看看计算出的面积是否与您期望的一致(在一定的公差范围内) .
并且假设百分比小于50(并且大于0)则:0 <角度<180 .
所以,我会在90度时做出我的第一次猜测 . 如果该区域在45处再次猜测太大,则尝试135.每次将大小减半并从前一个角度加上或减去它 . 继续缩小范围,直到得到的区域在您所期望的区域范围内 . 不到10个猜测应该会让你到那里 .
我认为这叫做"1/4 Tank dipstick problem":见:http://mathforum.org/library/drmath/view/61752.html
我希望这有帮助 .
这是我原来的答案,在我正确理解你要做的事情之前:
我不确定我是否完全理解你想要达到的目标,但是你可以像这样计算你想要的角度(以度为单位):
并且您总是可以将度数乘以(PI / 180)以获得弧度 .