(途中)空間図形「(その1/5)2025愛知公立高校入試図形 最後の問題3(3)」様を参考にsympyとFreeCADでやってみたい。

・(その5/5)作成中。積分は未です。

・**長文です。** 中学数学の範囲外が含まれています。
・久しぶりの３次元FreeCADのマクロ(2次元じゃない)で作図しました。
・ver0.4 体積の計算➁だけで、?まじめに計算しました。**216が出てきました。**

:::note info
(その1/5) 本ページ
[(その2/5) 三角柱で](https://qiita.com/mrrclb48z/items/ce12576a952ef9423795)
[(その3/5) ３つの球の交点計算で](https://qiita.com/mrrclb48z/items/4a292fbbba5a4deab23c)
[(その4/5) 空間の座標変換の計算で](https://qiita.com/mrrclb48z/items/f414a4c36fef18c33a9f)
[(その5/5) 作成中]()
:::

# オリジナル
#### Youtube
　東亜紗美moveforward数学教室 様 (0:00〜27:08)　
　**2025愛知公立高校入試図形 最後の問題3(3)**
　https://youtu.be/66KZjBObcVg

#### PDF
**・保護されていない通信**
　23愛知県＜R7年(2025年)全問PDF 大問3(3) **ページ下の「斜めに切頭?正四角錐」です。**
　http://homepage1.canvas.ne.jp/ynaka/R7PDF/23aichi.pdf#page=7
　＜数学苦手な中学生，応援します 様内
　http://homepage1.canvas.ne.jp/ynaka/index.html

# sympyのweb上での実行方法
SymPy Live Shellで。FreeCADのマクロは、以下で実行できません。
https://qiita.com/mrrclb48z/items/00dd08b0317069be9342#web%E4%B8%8A%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95sympy-live-shell%E3%81%A7
　
# sympyで(オリジナル 様の方法を参考に)
#### ver0.1 
・＞おもしろい解き方...
　＞基本に忠実に、原点に戻って...
　＞斜めになっているから...
　＞ソージが使える...
・(勉強中)私は、ソージが難しい。途中から、相似比が出てきて???
　＞19:15 てんやわんや( **deepl翻訳済み。** ますます、てんやわんや)
#### ver0.2
・割合で
　YouToubeのコメント 様と同じ。
```python
# ver0.2
from sympy import *
OA,AB=12,6
OD,DB=OA,AB*sqrt(2)
DI   =DB*Rational(1,2)       #;print(DI) 
h    =sqrt(OD**2-DI**2)      #;print(h) 
ODB  =Rational(1,2)*DB*h                   
print("#",ODB)
print("#",  Rational(1,3)                         # >三角錐だから...
          *(ODB*Rational(2,3)*Rational(1,2))      # △OHFの面積=△ODBの面積*(2/3)*(1/2)
          *( DI*Rational(2,3)+DI*Rational(1,2)))  # (OHFEの高さ+OHFGの高さ) ∵平面図より
# 18*sqrt(7)
# 7*sqrt(14)
```
# sympyで(いつもの方法で)
#### ver0.3  
・xyz座標です。ソージは、私は苦手です。
　法線ベクトルも平面ベクトルを使っていません。
　高校範囲を使っていない？と言っても、あまり説得力がありません。
・空間上の三角形の面積計算の方法イロイロ。ヘロンの公式、?外積。
　やっぱりTriangleのareaです。
```python
# ver0.3
from sympy import *
OA,AB=12,6
d=AB*Rational(1,2)
h=sqrt(OA**2-((d*sqrt(2))**2))      #;print(h) 
O=Point(0,0,0)
A,B,C,D=map(Point,[(-d,-d,-h),(d,-d,-h),(d,d,-h),(-d,d,-h)])
E=O+Rational(2,3)*(A-O)
F=O+Rational(1,2)*(B-O)
G=O+Rational(1,2)*(C-O)
H=O+Rational(2,3)*(D-O)
ODB  = Triangle(sss=(O.distance(D),D.distance(B),B.distance(O))).area
OEFGH= Rational(1,3) \
      *Triangle(sss=(O.distance(H),H.distance(F),F.distance(O))).area \
      *(Plane(O,F,H).distance(E)+Plane(O,F,H).distance(G))
print("#",ODB)
print("#",OEFGH)
# 18*sqrt(7)
# 7*sqrt(14)
```
#### ver0.4
・ver0.3と同じです。
　ver0.4 体積の計算➁だけで、?まじめに計算しました。**216が出てきました。**
```python
# ver0.4
from sympy import *
var('OA,AB',positive=True)
d=AB*Rational(1,2)
h=sqrt(OA**2-((d*sqrt(2))**2))         #;print(h) 
O=Point(0,0,0)
A,B,C,D=map(Point,[(-d,-d,-h),(d,-d,-h),(d,d,-h),(-d,d,-h)])
E=O+Rational(2,3)*(A-O)
F=O+Rational(1,2)*(B-O)
G=O+Rational(1,2)*(C-O)
H=O+Rational(2,3)*(D-O)
OEFGH= Rational(1,3) \
      *( Triangle(sss=(E.distance(F),F.distance(G),G.distance(E))).area  \
        +Triangle(sss=(E.distance(G),G.distance(H),H.distance(E))).area) \
      *Plane(E,F,G).distance(O)
print("#",OEFGH)
print("#",OEFGH.subs({OA:12,AB:6}))
# 7*AB**2*Abs(sqrt(-2*AB**2 + 4*OA**2))/216
# 7*sqrt(14)
```

#### ver0.5
・体積の計算➁だけです。
　行列式？。?スカラー三重積
　今は、高校範囲外？詳細は、工学系大学1,2年生のおねえさんおにいさんに聞いて下さい。

https://qiita.com/mrrclb48z/items/14db18bf452babfcf32a#chatgpt%E5%85%88%E7%94%9F%E3%81%B82%E5%9B%9E%E7%9B%AE

```python
# ver0.5　
from sympy import *
def tetrahedron_volume(A: Point3D, B: Point3D, C: Point3D, D: Point3D):
    # ベクトルAB, AC, AD を計算
    AB = Matrix(B - A)
    AC = Matrix(C - A)
    AD = Matrix(D - A)

    # スカラー三重積: AB ・ (AC × AD)
    volume_det = AB.dot(AC.cross(AD))

    # 三角錐の体積 = |スカラー三重積| / 6
    V = Rational(1, 6) * Abs(volume_det)
    return V
OA,AB=12,6
d=AB*Rational(1,2)
h=sqrt(OA**2-((d*sqrt(2))**2))      #;print(h) 
O=Point(0,0,0)
A,B,C,D=map(Point,[(-d,-d,-h),(d,-d,-h),(d,d,-h),(-d,d,-h)])
E=O+Rational(2,3)*(A-O)
F=O+Rational(1,2)*(B-O)
G=O+Rational(1,2)*(C-O)
H=O+Rational(2,3)*(D-O)
print("#",tetrahedron_volume(G,O,E,F)+tetrahedron_volume(H,O,E,F))
# 7*sqrt(14)
```

#### ver0.6
・？ver0.5と同じ。print文が違うだけ。
　体積の計算➁だけです。
　私は公式が大好き。三角錐の体積公式V=...は、覚えれませんけど。
```python
# ver0.6 
from sympy import *
var('x1:5,y1:5,z1:5')
OA,AB=12,6
d=AB*Rational(1,2)
h=sqrt(OA**2-((d*sqrt(2))**2))      #;print(h) 
O=Point(0,0,0)
A,B,C,D=map(Point,[(-d,-d,-h),(d,-d,-h),(d,d,-h),(-d,d,-h)])
E=O+Rational(2,3)*(A-O)
F=O+Rational(1,2)*(B-O)
G=O+Rational(1,2)*(C-O)
H=O+Rational(2,3)*(D-O)
V=Abs((x1 - x2)*((y1 - y3)*(z1 - z4) - (y1 - y4)*(z1 - z3)) - (y1 - y2)*((x1 - x3)*(z1 - z4) - (x1 - x4)*(z1 - z3)) + (z1 - z2)*((x1 - x3)*(y1 - y4) - (x1 - x4)*(y1 - y3)))/6
d_G  ={x1:G.x,y1:G.y,z1:G.z}
d_H  ={x1:H.x,y1:H.y,z1:H.z}
d_OEF={x2:O.x,y2:O.y,z2:O.z, x3:E.x,y3:E.y,z3:E.z, x4:F.x,y4:F.y,z4:F.z}
print("#", V.subs({**d_G,**d_OEF}) \
          +V.subs({**d_H,**d_OEF}))
# 7*sqrt(14)
```
# FreeCADのマクロで作図
・計算部分は、Ver.0.2 の コピー貼り付けです。
```python
import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
##############################################################
# ver0.2
from sympy import *
OA,AB=12,6
d=AB*Rational(1,2)
h=sqrt(OA**2-((d*sqrt(2))**2))      #;print(h) 
O=Point(0,0,0)
A,B,C,D=map(Point,[(-d,-d,-h),(d,-d,-h),(d,d,-h),(-d,d,-h)])
E=O+Rational(2,3)*(A-O)
F=O+Rational(1,2)*(B-O)
G=O+Rational(1,2)*(C-O)
H=O+Rational(2,3)*(D-O)
ODB  = Triangle(sss=(O.distance(D),D.distance(B),B.distance(O))).area
OEFGH= Rational(1,3) \
      *Triangle(sss=(O.distance(H),H.distance(F),F.distance(O))).area \
      *(Plane(O,F,H).distance(E)+Plane(O,F,H).distance(G))
print("#",ODB)
print("#",OEFGH)
# 18*sqrt(7)
# 7*sqrt(14)
##########################################################################################################
O_h=Point(0,0,-h)
##########################################################################################################
### 作図用 私の以下の３D作図バージョン古いです。2024-11-03
##########################################################################################################
### 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
    return ''
def myTxtXYZ(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=float(A.z)
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    #FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.2 mm'
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.7 mm'
    return
def myTxtXYZ_S(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt(xy_tx[2*i-2]) )
    return
def myLine(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),float(A.z)
    Bx,By,Bz=float(B.x),float(B.y),float(B.z)
    pl = FreeCAD.Placement()
    pl.Rotation.Q = (0.4247081540122249, 0.17592004639554645, 0.33985110062924484, 0.8204732460821097)
    pl.Base = FreeCAD.Vector(-3.9166066876399563, -2.1670824762243774, 1.7495260956243028)
    points = [FreeCAD.Vector(Ax,Ay,Az), FreeCAD.Vector(Bx,By,Bz)]
    line = Draft.make_wire(points, placement=pl, closed=False, face=True, support=None)
    Draft.autogroup(line)
    return
def myLine_S(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    return
def myLine_C(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    myLine(args[i],args[0])
    return
def myLine_H(*args):
    for i in range(1,len(args)):
        myLine(args[0],args[i])
    return
#######################################################
myLine_C    (A,B,C,D)
myLine_C    (E,F,G,H)
myLine_H    (O,A,B,C,D)
myTxtXYZ_S(O,"O",A,"A",B,"B",C,"C",D,"D")
myTxtXYZ_S(         E,"E",F,"F",G,"G",H,"H")
myTxtXYZ_S(O_h,"O_h")
#######################################################
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
# App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")
```
・久しぶりの３次元FreeCADのマクロ(2次元じゃない)で作図しました。
・私はCAD操作がわかっていません。わかりにくい角度でした。勉強中です。
isometric方向。斜め方向から。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/c0fbdfa1-3f51-4ee2-9be3-efc81ce153e5.png)

上空からです。平面図です。これは、viewアイコンがあるからできています。

![222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/0e18eac9-8591-4b7a-a709-68650fd5cf9e.png)


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。
#### ver0.1
てんやわんや　google検索済み。

#### ver0.2
・class sympy.core.numbers.Rational(p, q=None, gcd=None)
https://docs.sympy.org/latest/modules/core.html#sympy.core.numbers.Rational

#### ver0.3
・Distance between the plane and another geometric entity.
https://docs.sympy.org/latest/modules/geometry/plane.html#sympy.geometry.plane.Plane.distance

#### ver0.4
・class sympy.geometry.polygon.Triangle(*args, **kwargs)
A polygon with three vertices and three sides.
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle

#### ver0.5
・Matrices
https://docs.sympy.org/latest/tutorials/intro-tutorial/matrices.html

#### ver0.6
・Substitution
https://docs.sympy.org/latest/tutorials/intro-tutorial/basic_operations.html