2508:Conic distance

keyword

空間幾何 C++

概要

円錐の表面上の2点が与えられる。円錐上を通る最小距離を求める問題。
定石どおり、展開図上で考えて直線の距離に落とす。

int main(){
    double r, h, l, d1, a1,b1, d2, a2,b2, b3,th;
    complex<double> p1, p2, p3;
    while(scanf("%lf%lf%lf%lf%lf%lf",&r,&h,&d1,&a1,&d2,&a2)!=EOF){
        l = sqrt(r*r + h*h);
        th = (2*PI*r)/l;
        b1 = a1*th/360;
        b2 = a2*th/360;
        if(b1 >= b2 && fabs(b2-b1) > fabs(b2-(b1-th))) b1 -= th;
        else if(b2 >= b1 && fabs(b1-b2) > fabs(b1-(b2-th))) b2 -= th;
        p1 = polar(d1, b1);
        p2 = polar(d2, b2);
        printf("%.2f\n", abs(p2-p1));
    }

    return 0;
}