「【今年の1問】 2021年開成中-三角すいの体積」を参考にWolframAlphaとonline sympyとFreeCAD でやってみた。

(オリジナルポスト)

https://sansu-seijin.jp/nyushimondai/2021-nyushimondai/16825/

# 手計算1(ryuichi59様より)
7*6*1/2*6*1/3=42
# 手計算2(tttaaakki様より)
3.5*72/6=42
# 手計算3(高さの平均より)
以下でいいですか？こじつけてみました。
点Pと点Rの中点MPR(3,3,4.5)
点Qと点Sの中点MQS(3,3,1.0)
高さの平均は、中点MPRと中点MQSの鉛直距離4.5-1.0＝3.5cm
底面積=(0,0,0)と(6,0,0)と(6,6,0)と(0,6,0)の正方形の面積=6*6cm2
3次元なので、÷3
∴体積=(6*6)*3.5/3=42cm3


# WolframAlphaで
Tetrahedronはできました。

https://www.wolframalpha.com/input/?i=Tetrahedron%5B%280%2C0%2C5%29%2C%286%2C0%2C2%29%2C%286%2C6%2C4%29%2C%280%2C6%2C0%29%5D&lang=ja

volumeは、「次のように解釈：6 0 2 6 6 4」できませんでした。
未確認。mathematicaは、できると思います。

https://www.wolframalpha.com/input/?i=volume%5B%280%2C0%2C5%29%2C%286%2C0%2C2%29%2C%286%2C6%2C4%29%2C%280%2C6%2C0%29%5D&lang=ja

# online sympyで

online sympyで、①は実行できました。貼り付けて下さい。
https://live.sympy.org/

### ①最初に値を代入してみた。底面積×高さ×1/3
```python
from sympy import *
def myHeron(p1,p2,p3):
    a=p1.distance(p2)
    b=p2.distance(p3)
    c=p3.distance(p1)
    s = (a + b + c) / 2
    return sqrt(s * (s - a) * (s - b) * (s - c))
def myVolumeTetrahedron(p1,p2,p3,p4):
    ans=Plane(p1,p2,p3).projection(p4).distance(p4)*myHeron(p1,p2,p3)/3
    return ans
p1,p2,p3,p4= map(Point3D, [(0,0,5),(6,0,2),(6,6,4),(0,6,0)])
ans=myVolumeTetrahedron(p1,p2,p3,p4)
print(float(ans),"cm3")
# 42.0 cm3
```
### ②最後に値を代入してみた。底面積×高さ×1/3

online sympyで「Error: Operation timed out.」が、でました。
pycharmで実行できました。

```python
from sympy import *
def myHeron(p1,p2,p3):
    a=p1.distance(p2)
    b=p2.distance(p3)
    c=p3.distance(p1)
    s = (a + b + c) / 2
    return sqrt(s * (s - a) * (s - b) * (s - c))
def myVolumeTetrahedron(p1,p2,p3,p4):
    ans=Plane(p1,p2,p3).projection(p4).distance(p4)*myHeron(p1,p2,p3)/3
    return ans
var('px py pz')
var('qx qy qz')
var('rx ry rz')
var('sx sy sz')
p1,p2,p3,p4= map(Point3D, [(px,py,pz),(qx,qy,qz),(rx,ry,rz),(sx,sy,sz)])
ans=myVolumeTetrahedron(p1,p2,p3,p4)
ans=ans.subs([(px, 0), (py, 0), (pz, 5),
              (qx, 6), (qy, 0), (qz, 2),
              (rx, 6), (ry, 6), (rz, 4),
              (sx, 0), (sy, 6), (sz, 0)
             ])
print(float(ans),"cm3")
# 42.0 cm3
```

### ③行列の三次元の座標変換です。底面積×高さ×1/3
~~以下で質問中。~~ Page not found

https://ja.stackoverflow.com/questions/76305/pythonで-三角すいの体積の計算を座標からしました


### ④最後に値を代入してみた。行列式。(2021-06-07)
これが短くていいですね。
?my_Sの作り方。my_PQRSからmy_Sを作る方法を教えて下さい。
Matrixの4行目を取り出して、3行繰り返す方法です。よろしくお願いします。

```python
from sympy import *
var('px py pz')
var('qx qy qz')
var('rx ry rz')
var('sx sy sz')
my_PQRS=Matrix([[px,py,pz],
                [qx,qy,qz],
                [rx,ry,rz],
                [sx,sy,sz]
               ])
my_S   =Matrix([[sx,sy,sz],
                [sx,sy,sz],
                [sx,sy,sz]
              ])
ans=det(my_PQRS[:3,:3].T-my_S.T)\
    .subs([(px, 0), (py, 0), (pz, 5),
           (qx, 6), (qy, 0), (qz, 2),
           (rx, 6), (ry, 6), (rz, 4),
           (sx, 0), (sy, 6), (sz, 0)
         ])
print("#",'{:.3f}'.format(float(ans)/6),'cm3')
# 42.000 cm3
```


(参考)

https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%8C%90

(参考)

https://manabitimes.jp/math/1012


### ⑤最初に値を代入してみた。行列式。(2021-06-08)
これがもっと、短くていいですね。
?my_Sの作り方。my_PQRSからmy_Sを作る方法を教えて下さい。
Matrixの4行目を取り出して、3行繰り返す方法です。


```python
from sympy import *
def myVolumeTetrahedron(myTetrahedron):
    my_PQRS=Matrix(myTetrahedron)
    my_S   =Matrix([myTetrahedron[3],myTetrahedron[3],myTetrahedron[3]])
    return float(det(my_PQRS[:3, :3].T - my_S.T)/6)
myTetrahedron=[[0,0,5],[6,0,2],[6,6,4],[0,6,0]]
print("#",'{:.3f}'.format(myVolumeTetrahedron(myTetrahedron)),'cm3')
# 42.000 cm3
```




# FreeCAD 0.19のマウス操作でやってみたい。
省略。


# FreeCAD 0.19のマクロでやってみた。画像の挿入はこれからです。


~~ただいま、以下で質問中。~~(2021-06-04)

https://forum.freecadweb.org/viewtopic.php?f=16&t=59126


# あとがき
上記についてアドバイスよろしくお願いします。
もっと簡潔に書けると思います。

体積の求め方は、上面、下面それぞれを体積を変えないように、水平にした時の平均高さに、底面積をかける。3次元なので、÷3
(参考)

http://www.qi.mp.es.osaka-u.ac.jp/personal/imoto/index-j/essay/pyramid2.html