四面体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の操作を勉強中です。操作ができれば、角度及び辺の長さをチェックできる?はずです。
FreeCADで、Y軸正の方向(FreeCADのFront方向)を見ました。
見える方向を変えても、座標数字を見えるよう対応が必要でした。
現在、座標数字は上向き?(XY平面に平行に表示です。)
sympyで(T氏様の解答を参考)
勉強中。三平方の定理。
FreeCADのマクロで(T氏様の作図を参考)
作図してみました。ワイヤーフレームです。
丸とdashと色の勉強中。
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