LoginSignup
0
1

More than 1 year has passed since last update.

空間図形「22年 茨城大 教育 3」をsympyとFreeCADでやってみた。

Last updated at Posted at 2022-11-20

線分ACを3:1に外分する点....

オリジナル

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

sympyで

from sympy import *
def MensekiVector3D(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)
var('t')
A=Point3D( 1,-1,  0)
B=Point3D( 2, 1,  t)
D=Point3D(-2,-4,3/2)
C=A+Rational(3-1,3)*(D-A)
print("#(1)",C)
cosCAB=(C-A).dot(B-A)/(A.distance(C)*A.distance(B))
print("#(2)",cosCAB)
S2=(MensekiVector3D((C-A),(C-B))**2).simplify()
tMin=solve(diff(S2,t),t)[0]
print("#(3)",tMin,sqrt(S2.subs({t:tMin})))
#(1) Point3D(-1, -3, 1)
#(2) (t - 6)/(3*sqrt(t**2 + 5))
#(3) -3/4 3*sqrt(2)/4

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

FreeCADのマクロで

(3)のtの値で作図しています。寸法表示は、勉強中です。
アイソメトリックで見ました。

png1.png

Top(上空?)から見ました。もう少しわかりやすい方向,角度でみればよかった。

png2.png

import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
from sympy import *
def MensekiVector3D(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)
var('t')
A=Point3D( 1,-1,  0)
B=Point3D( 2, 1,  t)
D=Point3D(-2,-4,3/2)
C=A+Rational(3-1,3)*(D-A)
print("#(1)",C)
cosCAB=(C-A).dot(B-A)/(A.distance(C)*A.distance(B))
print("#(2)",cosCAB)
S2=(MensekiVector3D((C-A),(C-B))**2).simplify()
tMin=solve(diff(S2,t),t)[0]
print("#(3)",tMin,sqrt(S2.subs({t:tMin})))
#(1) Point3D(-1, -3, 1)
#(2) (t - 6)/(3*sqrt(t**2 + 5))
#(3) -3/4 3*sqrt(2)/4
#########################################################################################################
B=B.subs({t:tMin})
#########################################################################################################
# 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
myTxtXYZ_S(A,"A",B,"B",C,"C",D,"D")
myLine_S  (A,B,C,A)
myLine    (A,D)

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")
0
1
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
1