LoginSignup
0
0

平面ベクトル「2023青森公立大学前期【3】」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2023-04-15

問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
いつもの、ベクトル成分表示?による計算です。

オリジナル

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

公式ホームページ 2019年度〜2023年度入学者選抜
https://www.nebuta.ac.jp/for-examinee/about-past-problems

sympyで(オリジナルと公式ホームページの解答例を参考に)

余弦定理と相似の勉強中。
sympyのVector Moduleでやってみたい。

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

・点Bが原点です。
・全点の座標計算を先にしました。

from sympy import *
AB,BC,AD,Bdeg=8,5,3,60
A=Point(AB*cos(Bdeg/180*pi),AB*sin(Bdeg/180*pi))
B=Point(0 ,0)
C=Point(BC,0)
D=Circle(A,B,C).intersection( Circle(A,AD) ) [1]
E=Line(B,C).intersection(Line(A,D))[0]
print("#(1)",C.distance(D))
print("#(2)",C.distance(E),D.distance(E))
print("#(3)",Triangle(C,D,E).inradius,Triangle(E,D,C).inradius)
#(1) 5
#(2) 245/39 275/39
#(3) -25*sqrt(3)/26 25*sqrt(3)/26

・上と同じです。(2023/08/15作成)バージョンアップ?
・外心が原点です。

from sympy import *
(AB,BC,AD,Deg_ABC)=(8,5,3,60)
def myTriangle_Move_CircumcenterToOrigin(dumABC):
    dumO=dumABC.circumcircle.args[0]
    return Triangle( dumABC.vertices[0]-dumO,
                     dumABC.vertices[1]-dumO,
                     dumABC.vertices[2]-dumO )
O=Point(0,0)
myABC=myTriangle_Move_CircumcenterToOrigin( Triangle(sas=(AB,Deg_ABC,BC)) )
A=myABC.args[2]
B=myABC.args[0]
C=myABC.args[1]
D=Circle(O,myABC.circumradius).intersection( Circle(A,AD))[1]
E=Line(B,C).intersection(Line(A,D))[0]
print("#(1)",Point(C).distance(D))
print("#(2)",Point(C).distance(E),Point(D).distance(E) )
print("#(3)",Triangle(C,D,E).inradius)
#(1) 5
#(2) 245/39 275/39
#(3) -25*sqrt(3)/26

①私の環境は,pycharmです。
②よく聞くのは、Jupyterです。
③web上で、上記のソースを「SymPy Live shell」に、コピー貼り付けでもできました。
黒背景の右上に、マウスを移動すると、コピーマークが発生します。

FreeCADのマクロで作図

点Bが原点です。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
AB,BC,AD,Bdeg=8,5,3,60
A=Point(AB*cos(Bdeg/180*pi),AB*sin(Bdeg/180*pi))
B=Point(0 ,0)
C=Point(BC,0)
D=Circle(A,B,C).intersection( Circle(A,AD) ) [1]
E=Line(B,C).intersection(Line(A,D))[0]
print("#(1)",C.distance(D))
print("#(2)",C.distance(E),D.distance(E))
print("#(3)",Triangle(C,D,E).inradius,Triangle(E,D,C).inradius)
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
# 円の作図 FrecCADのdocより
# https://wiki.freecad.org/Macro_Circle
def circle(x=0.0,y=0.0,z=0.0,radius=0.0,diameter=0.0,circumference=0.0,area=0.0,startangle=0.0,endangle=0.0,arc=0.0,anglecenter=0.0,cord=0.0,arrow=0.0,center=0,placemObject=""):
    from math import sqrt, pi
    if placemObject == "":
        pl = FreeCAD.Placement()
        pl.Rotation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()   
        pl.Base = FreeCAD.Vector(x,y,z)
    else:
        pl = FreeCAD.Placement()
        pl = placemObject                                  # placement imposted
    if diameter != 0:                                      # with diameter
        radius = diameter / 2.0
    elif circumference != 0:                               # with circumference
        radius = (circumference / pi) / 2.0
    elif area != 0:                                        # with area
        radius =  sqrt((area / pi))
    elif (cord != 0) and (arrow != 0):                     # with cord and arrow
        radius = ((arrow**2) + (cord**2) / 4.0) / (arrow*2) 
    elif (arc != 0) and (anglecenter != 0):                # with arc and anglecenter central in degrees
        radius = ((360/anglecenter)*arc) / pi/2.0
        if endangle != 0:
            startangle  = endangle - anglecenter
        endangle   = anglecenter + startangle
        startangle  = endangle - anglecenter
    if radius != 0:
        try:
            Draft.makeCircle(radius,placement=pl,face=False,startangle=startangle,endangle=endangle,support=None)
            if center != 0:
                x=pl.Base.x
                y=pl.Base.y
                z=pl.Base.z
                Draft.makePoint(x,y,z)
            
        except Exception:
            App.Console.PrintError("Unexpected keyword argument" + "\n")
        App.ActiveDocument.recompute()
    else:
        App.Console.PrintMessage("Unexpected keyword argument" + "\n")
        App.Console.PrintMessage("circle(x,y,z,radius,diameter,circumference,area,startangle,endangle,[arc,anglecenter],[cord,arrow],center,placemObject)" + "\n")
        App.Console.PrintMessage("circle(radius=10.0,placemObject=App.Placement(App.Vector(11,20,30), App.Rotation(30,40,0), App.Vector(0,0,0)))" + "\n")
    return
def myCircle_2D(x,y,r):
    circle(x=float(x),y=float(y),z=0.0,
           #radius=float(r),
           radius=float(abs(r)),
           center=1,
           placemObject=App.Placement(App.Vector(float(x),float(y),0),
           App.Rotation(0,0,0),App.Vector(0,0,0)))
    return
######################################################################
def myXYZ2Txt_2D(A):
    return '(' + str(A.x) + ',' + str(A.y) +  ')'
def myTxtXYZ_2D(A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)
    P5z=0.0
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.5 mm'
    #FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.2 mm'
    return
def myTxtXYZ_S_2D(*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_2D(xy_tx[2*i-2]) )
    return
def myLine_2D(A,B):
    Ax,Ay,Az=float(A.x),float(A.y),0.0
    Bx,By,Bz=float(B.x),float(B.y),0.0
    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)
    return
def myLine_S_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    return
def myLine_C_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[i-1],args[i])
    myLine_2D(args[i],args[0])
    return
myTxtXYZ_S_2D(A,"A",B,"B",C,"C",D,"D",E,"E")
myLine_C_2D(A,B,C,D)
myLine_S_2D(C,E,D)
myCircle_2D(Circle  (A,B,C).center.x,   Circle  (A,B,C).center.y,   Circle(A,B,C).radius)

print(Triangle(C,D,E).incenter.x, Triangle(C,D,E).incenter.y, Triangle(C,D,E).inradius)
myCircle_2D(Triangle(C,D,E).incenter.x, Triangle(C,D,E).incenter.y, Triangle(C,D,E).inradius)
#
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")

isometric方向?です。

0png.png

上空から?です。
Originを非表示しています。マウスの操作勉強中です。

1png.png

参考

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