POJ 2508 - Conic distance

http://poj.org/problem?id=2508

概要

3次元上に,中心が原点で半径が r の円を底面とし,高さが h の円錐がある.

円錐座標で側面上の2点が与えられるので,側面上での2点間の距離を答える.

ある点 P は,円錐座標では (d, A) で表され,d は円錐の先端と P の距離,A は y = 0 平面と (0,0,0), (0,0,h), P のなす面がなす角度である.

制約

特になし

解法

展開図において直線距離を計算すればいい.

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <complex>
 4 using namespace std;
 5 typedef complex<double> P;
 6 static const double PI = acos(-1.0);
 7 
 8 double solve(double r, double h, double d1, double d2, double theta)
 9 {
10   const double phi = theta * r / sqrt(r*r + h*h);
11   return sqrt(d1*d1 + d2*d2 - 2*d1*d2*cos(phi));
12 }
13 
14 int main()
15 {
16   double r, h, d1, A1, d2, A2;
17   while (scanf("%lf %lf %lf %lf %lf %lf", &r, &h, &d1, &A1, &d2, &A2) != EOF) {
18     const double t1 = A1 * PI/180.0;
19     const double t2 = A2 * PI/180.0;
20     const double theta = fabs(t2 - t1);
21     printf("%.2f\n", min(solve(r, h, d1, d2, theta), solve(r, h, d1, d2, 2*PI - theta)));
22   }
23   return 0;
24 }
poj/2508.cc