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 のなす面がなす角度である.
制約
特になし
解法
展開図において直線距離を計算すればいい.
poj/2508.cc1 #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 }