空間図形「京都大学前期文系2022年第５問」「京都大学前期理系2022年第４問」をsympy とFreeCADでやってみた。

四面体OABCがOA=4,OB=AB=BC=3,OC=AC=2√3....

オリジナル

なかけん様の図を参考にしました。そのまま?
点Mを使っていません。

https://math.nakaken88.com/problem/kyoto-u-r-2022-4/

https://mathmathmass.exblog.jp/31072004/

https://mathmathmass.exblog.jp/31023579/

上と同じです。大学入試数学問題集成＞前期文系【5】,理系共通,理系は【4】

https://mathexamtest.web.fc2.com/2022/202210541/2022105410100mj.html#top-0105

# sympyで(なかけん様の解答を参考)
ベクトルでなく、sympy3Dでやっています。ベクトルの勉強中。

```python
from sympy import *
var('x y z s')
def mySphereFormula(myP,myR):
    return ((x-myP.x)**2+(y-myP.y)**2+(z-myP.z)**2-myR**2).expand()
A=Point(0,0,0)
B=Point(3,0,0)
ans=Circle(A,2*sqrt(3)).intersection(Circle(B,3))
C=Point(ans[1].x,ans[1].y,0)
ans=solve([mySphereFormula(A,4),
           mySphereFormula(B,3),
           mySphereFormula(C,2*sqrt(3))],[x,y,z])
O=Point(ans[1][0],ans[1][1],ans[1][2])
P=B+s*(C-B)
G=Rational(1,3)*(O+A+P)
print("#(1)",(G-P).dot(A-O))
print("#(2)",P.distance(G).subs({s:solve(diff((P.distance(G))**2),s)[0]}))
#(1) 0
#(2) 4/3
```

# FreeCADのマクロで(なかけん様の図を参考)
上のsympy計算に、FreeCAD作図を追加しました。
```python
import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
from sympy import *
var('x y z s')
def mySphereFormula(myP,myR):
    return ((x-myP.x)**2+(y-myP.y)**2+(z-myP.z)**2-myR**2).expand()
A=Point(0,0,0)
B=Point(3,0,0)
ans=Circle(A,2*sqrt(3)).intersection(Circle(B,3))
C=Point(ans[1].x,ans[1].y,0)
ans=solve([mySphereFormula(A,4),
           mySphereFormula(B,3),
           mySphereFormula(C,2*sqrt(3))],[x,y,z])
O=Point(ans[1][0],ans[1][1],ans[1][2])
P=B+s*(C-B)
G=Rational(1,3)*(O+A+P)
print("#(1)",(G-P).dot(A-O))
ss=solve(diff((P.distance(G))**2),s)[0]
print("#(2)",P.distance(G).subs({s:ss}))
# #(1) 0
# #(2) 4/3
P=P.subs({s:ss})
G=G.subs({s:ss})
# #########################################################################################################
# 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxt_XYZ(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'
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)
myTxt_XYZ(A,"A"+myXYZ2Txt(A))
myTxt_XYZ(B,"B"+myXYZ2Txt(B))
myTxt_XYZ(C,"C"+myXYZ2Txt(C))
myTxt_XYZ(O,"O"+myXYZ2Txt(O))
myTxt_XYZ(P,"P"+myXYZ2Txt(P))
myTxt_XYZ(G,"G"+myXYZ2Txt(G))
myLine(O,A)
myLine(O,B)
myLine(O,C)
myLine(A,B)
myLine(B,C)
myLine(C,A)
myLine(P,G)
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の操作を勉強中です。操作ができれば、角度及び辺の長さをチェックできる？はずです。

![png1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/cfb78842-3b14-bde3-b522-feeef4a609e0.png)

FreeCADで、Y軸正の方向(FreeCADのFront方向)を見ました。
見える方向を変えても、座標数字を見えるよう対応が必要でした。
現在、座標数字は上向き?(XY平面に平行に表示です。）

![png2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/3700e8a6-28a7-f178-19ab-02e110d71a44.png)


# sympyで(T氏様の解答を参考)
勉強中。三平方の定理。

# FreeCADのマクロで(T氏様の作図を参考)
作図してみました。ワイヤーフレームです。
丸とdashと色の勉強中。

![png.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/5bcc8ac0-1967-8cbd-4504-df47b8a75f15.png)


```python
import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
# 計算
from sympy import *
var('x y z s')
def mySphereFormula(myP,myR):
    return ((x-myP.x)**2+(y-myP.y)**2+(z-myP.z)**2-myR**2).expand()
OA      =4
OB,AB,BC=3,3,3
OC,AC   =2*sqrt(3),2*sqrt(3)
O=Point(  0,0,0)
C=Point(-OC,0,0)
ans=Circle(O,OA).intersection(Circle(C,AC))
A=Point(ans[1].x,ans[1].y,0)
M=Rational(1,2)*(O+A)
ans=solve([mySphereFormula(O,OB), \
           mySphereFormula(A,AB), \
           mySphereFormula(C,BC)],[x,y,z])
B=Point(ans[1][0],ans[1][1],ans[1][2])
P=B+s*(C-B)
G=Rational(1,3)*(O+A+P)
print("#(1)",(G-P).dot(A-O))
ss=solve(diff((P.distance(G))**2),s)[0]
P=P.subs({s:ss})
G=Rational(1,3)*(O+A+P)
print("#(2)",P.distance(G))
#(1) 0
#(2) 4/3
# #########################################################################################################
# 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
def myTxt_XYZ(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'
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)
myTxt_XYZ(O,"O"+myXYZ2Txt(O))
myTxt_XYZ(A,"A"+myXYZ2Txt(A))
myTxt_XYZ(B,"B"+myXYZ2Txt(B))
myTxt_XYZ(C,"C"+myXYZ2Txt(C))
myTxt_XYZ(P,"P"+myXYZ2Txt(P))
myTxt_XYZ(G,"G"+myXYZ2Txt(G))
myTxt_XYZ(M,"M"+myXYZ2Txt(M))

myLine(O,A)
myLine(O,B)
myLine(O,C)
myLine(A,B)
myLine(B,C)
myLine(C,A)
myLine(P,G)
myLine(G,M)
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")
```

# 参考
直方体のサイズ1x2x3

https://qiita.com/mrrclb48z/items/09d91cde8cf428db6c91