LoginSignup
0
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-07-02

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

オリジナル

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

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

sympyで(なかけん様の解答を参考)

ベクトルでなく、sympy3Dでやっています。ベクトルの勉強中。

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作図を追加しました。

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

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

png2.png

sympyで(T氏様の解答を参考)

勉強中。三平方の定理。

FreeCADのマクロで(T氏様の作図を参考)

作図してみました。ワイヤーフレームです。
丸とdashと色の勉強中。

png.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0