HDU 4741 Save Labman No.004 计算几何 数学
生活随笔
收集整理的這篇文章主要介紹了
HDU 4741 Save Labman No.004 计算几何 数学
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接
這道題會(huì)暴露很多孩紙的高數(shù)學(xué)的好不好。如何計(jì)算三維直線的最短距離和垂足的坐標(biāo),學(xué)習(xí)鏈接
之后的就是代入公式計(jì)算了。
1 #include <stdio.h> 2 #include <math.h> 3 struct Point { 4 double x, y, z; 5 Point(double x = 0, double y = 0, double z = 0):x(x), y(y), z(z) {} 6 void read() { 7 scanf("%lf%lf%lf", &x, &y, &z); 8 } 9 void write() { 10 printf("%.6lf%.6lf%.6lf", x, y, z); 11 } 12 Point operator + (const Point &b) { 13 return Point(x + b.x, y + b.y, z + b.z); 14 } 15 Point operator - (const Point &b) { 16 return Point(x - b.x, y - b.y, z - b.z); 17 } 18 Point operator * (double k) { 19 return Point(x * k, y * k, z * k); 20 } 21 Point operator / (double k) { 22 return Point(x / k, y / k, z / k); 23 } 24 Point cross(const Point &b) { 25 return Point(y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x); 26 } 27 double len() { 28 return sqrt(x * x + y * y + z * z); 29 } 30 double operator * (const Point &b) { 31 return x * b.x + y * b.y + z * b.z; 32 } 33 }; 34 typedef Point Vector; 35 int main() { 36 int T; 37 scanf("%d", &T); 38 while (T--) { 39 Point A, B, C, D; 40 A.read(); 41 B.read(); 42 C.read(); 43 D.read(); 44 Vector AB= B - A, CD = D - C; 45 Vector n = AB.cross(CD), AC = C - A, CA = A - C; 46 double nlen = n.len(), dis = n * AC / nlen; 47 double t1 = AC.cross(CD) * AB.cross(CD) / nlen / nlen; 48 double t2 = CA.cross(AB) * CD.cross(AB) / nlen / nlen; 49 Point E = A + (AB * t1); 50 Point F = C + (CD * t2); 51 if (dis < 0) 52 dis = -dis; 53 printf("%.6lf\n", dis); 54 E.write(); 55 putchar(' '); 56 F.write(); 57 putchar('\n'); 58 } 59 return 0; 60 } View Code?
轉(zhuǎn)載于:https://www.cnblogs.com/Apiec/p/6063177.html
總結(jié)
以上是生活随笔為你收集整理的HDU 4741 Save Labman No.004 计算几何 数学的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle12c开启scott账户
- 下一篇: 鼠标滚轮滚动方向