LoginSignup
0
0

More than 1 year has passed since last update.

空間図形「21年 宮城大 事業構想・食品業 5」をsympyとFreeCADでやってみた。

Last updated at Posted at 2022-12-03

空間内の4点....

オリジナル

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

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

勉強中

sympyで(det:行列式)

from sympy import *
def myTaisekiGyouretuSiki(PTO,PTA,PTB,PTC):
    return Matrix([[PTA.x-PTO.x, PTA.y-PTO.y, PTA.z-PTO.z], \
                   [PTB.x-PTO.x, PTB.y-PTO.y, PTB.z-PTO.z], \
                   [PTC.x-PTO.x, PTC.y-PTO.y, PTC.z-PTO.z]]).det()/6
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)
var('b c')
O=Point3D(0,0, 0)
A=Point3D(1,1, 2)
B=Point3D(1,b,-1)
C=Point3D(0,1, c)
ans=solve(myTaisekiGyouretuSiki(O,A,B,C),c)[0]
print("#(1)",ans)
C=Point3D(0,1, c).subs({c:ans})
ans=solve([Eq((A-O).x,(B-C).x),Eq((A-O).y,(B-C).y),Eq((A-O).z,(B-C).z)],b)[b]
print("#(2)",ans)
B=B.subs({b:ans})
C=C.subs({b:ans})
print("#(3)",myMensekiVector3D(A-O,B-O)*2)
#(1) -3/(b - 1)
#(2) 2
#(3) sqrt(35)

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

FreeCADのマクロで

マクロからsympyを使っています。
(3)の条件で作図しています。
ねじれていないので、大丈夫だと思います。ねじれの点検が必要ですか?
CADで面積を出せるはずです。(勉強中)

an Isometric view

png.png

png1.png

Top(上から見た)

png2.png

import FreeCAD
import Part
import Draft
import Mesh
#########################################################################################################
from sympy import *
def myTaisekiGyouretuSiki(PTO,PTA,PTB,PTC):
    return Matrix([[PTA.x-PTO.x, PTA.y-PTO.y, PTA.z-PTO.z], [PTB.x-PTO.x, PTB.y-PTO.y, PTB.z-PTO.z], [PTC.x-PTO.x, PTC.y-PTO.y, PTC.z-PTO.z]]).det()/6
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)
var('b c')
O=Point3D(0,0, 0)
A=Point3D(1,1, 2)
B=Point3D(1,b,-1)
C=Point3D(0,1, c)
ans=solve(myTaisekiGyouretuSiki(O,A,B,C),c)[0]
print("#(1)",ans)
C=Point3D(0,1, c).subs({c:ans})
ans=solve([Eq((A-O).x,(B-C).x),Eq((A-O).y,(B-C).y),Eq((A-O).z,(B-C).z)],b)[b]
print("#(2)",ans)
B=B.subs({b:ans})
C=C.subs({b:ans})
print("#(3)",myMensekiVector3D(A-O,B-O)*2)
#(1) -3/(b - 1)
#(2) 2
#(3) sqrt(35)
#########################################################################################################
# 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(O,"O",A,"A",B,"B",C,"C",O,"O")
myLine_S  (O,A,B,C,O)
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")

参考

(勉強中)

多面体が正の体積を持つならば、その頂点集合は共面でない点を必ず含む。<

DeepL翻訳より
コプラナリティー
コプラナリティ(Coplanarity
コプラナリティ(共平面性

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