1. 程式人生 > >hdu 1411 校慶神祕建築 (尤拉四面體公式)

hdu 1411 校慶神祕建築 (尤拉四面體公式)

題目連結:哆啦A夢傳送門

參考部落格:

https://www.cnblogs.com/dgsrz/articles/2590309.html

 

1,建議x,y,z直角座標系。設A、B、C少拿點的座標分別為(a1,b,1,c1),(a2,b2,c2),(a3,b3,c3),四面體O-ABC的六條稜長分別為l,m,n,p,q,r;

2,四面體的體積為​​​​​​​

\large \frac{\underset{OA}{\rightarrow}\times \underset{OB}{\rightarrow}}{2}表示\large \Delta OAB的面積,再根據叉積公式 \large \underset{a}{\rightarrow}\times \underset{b}{\rightarrow}=\left | a \right |\left | b \right |*sin\o,所以就很容易得到上面的向量公式了,

兩向量叉積可以用行列式表示,詳情參考維基:我愛維基

 

將這個式子平方後得到:

3,根據向量數量積

的座標表示式及數量積的定義得​​​​​​​

又根據餘弦定理得​​​​​​​,這裡用的是點積,不同於上面的叉積,為什麼我們會知道這裡用的是點積呢?很簡單,我們從表示式就很容易知道了。

4,將上述的式子帶入(1),就得到了傳說中的尤拉四面體公式​​​​​​​

 

最後結果就出來了,簡單的解個行列式。

程式碼:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;
///AB,AC,AD,BC,BD,CD。
int main()
{
    double p,q,r,m,n,l;

    ///注意對應儲存邊
    while(~scanf("%lf%lf%lf%lf%lf%lf",&n,&m,&p,&l,&q,&r))
    {
        double tmp1=(p*p+q*q-n*n)/2.0;
        double tmp2=(p*p+r*r-m*m)/2.0;
        double tmp3=(q*q+r*r-l*l)/2.0;

        double volume=p*p*q*q*r*r+tmp1*tmp3*tmp2*2;
        volume=volume-(tmp2*tmp2*q*q+tmp3*tmp3*p*p+r*r*tmp1*tmp1);

        printf("%.4f\n",sqrt(volume)/6.0);
    }
    return 0;
}

 

我的標籤:做個有情懷的程式設計師。