2011-0038
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
此题给出三角形OAB一个顶点O(0,0),边OA的长度r,垂心H(h,0),OA和OH的夹角a的范围[a1,a2],求B点在其y坐标最大时的坐标。 h<=r;
补充一点,此题默认A点在第一象限,即A点坐标仅为(r cos a, r sin a),因为没有图示,在forum询问了才得知。
根据垂心的性质,OH垂直AB,BH垂直OA, 所以可得B点 (r cos a,y),且向量OA和BH内积为0.
(r cos a, r sin a)(h-r cos a, -y)=0;
得y=(h-r cos a)/tan(a)
dy/da=(csc(a) + cos(a)) * r - h*csc^2^ a
d^2^y/da^2^ = -0.125 csc^3^ a * r * ((cos(4a) + 15) - 16(h/r)*cos a)<= 0
所以y 关于a 是单峰函数,y的最大值可用三分法求得
{{{
#include<cmath>
#include<cstdio>
double maxx,maxy,h,r;
inline double solve(double a){
double x,y;
x=r*cos(a);
y=(h-x)/tan(a);
if(y>maxy){
maxy=y;
maxx=x;
}
return y;
}
int main(){
double a1,a2,m1,m2;
while(scanf("%lf%lf%lf%lf",&h,&r,&a1,&a2)==4){
maxy=-1e100;
solve(a1);solve(a2);
int xxxxx=100;
while(xxxxx--){
m1=(a1*2+a2)/3;
m2=(a1+a2*2)/3;
if(solve(m1)<solve(m2))a1=m1;else a2=m2;
}
printf("%.3lf %.3lf\n",maxx,maxy);
}
return 0;
}
}}}
occupied by ZhouYuChen
此题给出三角形OAB一个顶点O(0,0),边OA的长度r,垂心H(h,0),OA和OH的夹角a的范围[a1,a2],求B点在其y坐标最大时的坐标。 h<=r;
补充一点,此题默认A点在第一象限,即A点坐标仅为(r cos a, r sin a),因为没有图示,在forum询问了才得知。
根据垂心的性质,OH垂直AB,BH垂直OA, 所以可得B点 (r cos a,y),且向量OA和BH内积为0.
(r cos a, r sin a)(h-r cos a, -y)=0;
得y=(h-r cos a)/tan(a)
dy/da=(csc(a) + cos(a)) * r - h*csc2 a
d2y/da2 = -0.125 csc3 a * r * ((cos(4a) + 15) - 16(h/r)*cos a)<= 0
所以y 关于a 是单峰函数,y的最大值可用三分法求得
#include<cmath>
#include<cstdio>
double maxx,maxy,h,r;
inline double solve(double a){
double x,y;
x=r*cos(a);
y=(h-x)/tan(a);
if(y>maxy){
maxy=y;
maxx=x;
}
return y;
}
int main(){
double a1,a2,m1,m2;
while(scanf("%lf%lf%lf%lf",&h,&r,&a1,&a2)==4){
maxy=-1e100;
solve(a1);solve(a2);
int xxxxx=100;
while(xxxxx--){
m1=(a1*2+a2)/3;
m2=(a1+a2*2)/3;
if(solve(m1)<solve(m2))a1=m1;else a2=m2;
}
printf("%.3lf %.3lf\n",maxx,maxy);
}
return 0;
}
occupied by ZhouYuChen