LoginSignup
0
0

More than 1 year has passed since last update.

空間図形「21旭川医大医4」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2022-12-11

...△ABCの外接円をKとする...
オリジナル

上と同じです。大学入試数学問題集成>【4】

sympyで(オリジナルのやり方)

勉強中

sympyで(sympy的?安易なやり方)

kamelink様の解答を見ながらです。20行でした。
答えがでるとは思いませんでした。

from sympy import *
var('x y z')
def myMensekiVector3D(P,Q):
    return Rational(1, 2) * sqrt(P.distance(Point(0, 0, 0)) ** 2 * Q.distance(Point(0, 0, 0)) ** 2 \
                                 - P.dot(Q) ** 2)
def mySphereFormula(myP,myR):
    return ((x-myP.x)**2+(y-myP.y)**2+(z-myP.z)**2-myR**2).expand()
O,A,B,C=map(Point,([0,0,0],[1,-2,2],[-1,-3,1],[-1,0,4]))
tr=Triangle(sss=(A.distance(B),B.distance(C),C.distance(A)))
r=tr.circumcenter.distance(tr.vertices[0])
H=Plane(A,B,C).projection(O)
J=Point(solve([mySphereFormula(A,r),
               mySphereFormula(B,r),
               mySphereFormula(C,r)],[x,y,z])[0]
        )
print("#(1)    ",myMensekiVector3D((B-A),(C-A)))
print("#(2)    ",H)
print("#(3)(i) ",J)
P=(H-O)+(r+J.distance(H))/J.distance(H)*(J-H)
print("#(3)(ii)",(O.distance(P)**2).simplify() )
#(1)     3*sqrt(2)
#(2)     Point3D(0, -2, 2)
#(3)(i)  Point3D(-1, -3/2, 5/2)
#(3)(ii) 3*sqrt(3) + 14

以下の、on line sympyで、上記のソースコードを貼り付けて実行できました。
私の環境は,pycharmです。 

FreeCADのマクロで

マクロからsympyを使っています。
以下のソースコード内で、1行ごまかしてあります。
①回転の勉強中です。教えて下さい。行列の回転?クォータニオン又はオイラー角ですか?
②?半径OPの球面(作図してありません)の中に、外接円Kが含まれるのをsympyで証明したい?
アドバイスよろしくお願いします。

png1.png

import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
from sympy import *
var('x y z')
def myMensekiVector3D(P,Q):
    return Rational(1, 2) * sqrt(P.distance(Point(0, 0, 0)) ** 2 * Q.distance(Point(0, 0, 0)) ** 2 \
                                 - P.dot(Q) ** 2)
def mySphereFormula(myP,myR):
    return ((x-myP.x)**2+(y-myP.y)**2+(z-myP.z)**2-myR**2).expand()
O,A,B,C=map(Point,([0,0,0],[1,-2,2],[-1,-3,1],[-1,0,4]))
tr=Triangle(sss=(A.distance(B),B.distance(C),C.distance(A)))
r=tr.circumcenter.distance(tr.vertices[0])
H=Plane(A,B,C).projection(O)
J=Point(solve([mySphereFormula(A,r),
               mySphereFormula(B,r),
               mySphereFormula(C,r)],[x,y,z])[0]
        )
print("#(1)    ",myMensekiVector3D((B-A),(C-A)))
print("#(2)    ",H)
print("#(3)(i) ",J)
P=(H-O)+(r+J.distance(H))/J.distance(H)*(J-H)
print("#(3)(ii)",(O.distance(P)**2).simplify() )
#(1)     3*sqrt(2)
#(2)     Point3D(0, -2, 2)
#(3)(i)  Point3D(-1, -3/2, 5/2)
#(3)(ii) 3*sqrt(3) + 14
#########################################################################################################
# 3D作図
def myXYZ2Txt(A):
    return '(' + str(A.x) + ',' + str(A.y) + ',' + str(A.z) + ')'
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'
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]) )
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)
def myLine_S(*args):
    for i in range(1,len(args)):
        myLine(args[i-1],args[i])
    return 0
#nv=Plane(A,B,C).normal_vector
zaxis = App.Vector(1,0,0)
place2 = App.Placement(App.Vector(float(J.x),float(J.y),float(J.z)), App.Rotation(zaxis, 45))  #この行は、ごまかしてあります。
circle2 = Draft.make_circle(float(r), placement=place2,face=False,support=None)
myTxtXYZ_S(O,"O",A,"A",B,"B",C,"C",H,"H",J,"J",P,"P")
myLine_S  (O,H,P,O)
myLine_S  (A,B,C,A)
myLine    (B,C)
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")

参考

Scripting<

フランス語が得意の方へ。
以下を紹介されました。>
===[Fr] Lectures sur PartDesign ===

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