LoginSignup
0
0

4点が同一円周上「2017 青森公立大学前期経営経済学部【3】」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2023-08-16

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

オリジナル

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

sympyで(T氏の数学日記 様の方法で)

勉強中。方ベキの定理を勉強中です。

sympyで(ベクトルの成分表示?です。)

・内心を、原点の位置にしました。myTriangle_Move_IncenterToOrigin関数。
・プログラムの途中の、# pi/2 Aの角度の点検です。
・三角形の外心と3点を通る円の中心は、同じです。
・(2),(3)のprint文は、F,Qの1行で十分でした。他の方法がありそうです。
・sqrtdenest関数が必要でした、
https://qiita.com/WolfMoon/items/ad6b23cc72b5b340f27c
https://docs.sympy.org/latest/modules/simplify/simplify.html#sympy.simplify.sqrtdenest.sqrtdenest
・パイソニスタの方へ、
 def myArgs3(dumABC)関数は引数の数が3個限定です。
 n個に対応する方法を教えて下さい。

from sympy import *
def myTriangle_Move_IncenterToOrigin(dumABC):
    dumO=dumABC.incircle.args[0]
    return Triangle( dumABC.vertices[0]-dumO,
                     dumABC.vertices[1]-dumO,
                     dumABC.vertices[2]-dumO )
def myArgs3(dumABC):
    return dumABC.args[0],dumABC.args[1],dumABC.args[2]
def myUnitVector(u):
    return u/(Point(0,0).distance(u))
(AB,BC,CA) =(8,10,6)
(O),(B,C,A)=(Point(0,0)),(myArgs3( myTriangle_Move_IncenterToOrigin( Triangle(sss=(BC,CA,AB) ) )))
# print("#",Polygon(A,B,C).angles[A])  # pi/2
D=Line(A,B).intersection(Line(C,C+myUnitVector(A-C)+myUnitVector(B-C) ) )[0]
E=Line(C,A).projection(O)
F=Line(B,C).projection(O)
G=Line(C,D).intersection(Line(E,F))[0]
H=Line(B,C).intersection(Line(A,G))[0]
(P,Q)=Circle(Triangle(A,B,C).incircle.args[0],Triangle(A,B,C).inradius).intersection( Line(A,H))
print("#問題1",A.distance(D))
# 
print("#問題2",Circle(O,E,C).center.distance(O))
print("#問題2",Circle(O,E,C).center.distance(E))
print("#問題2",Circle(O,E,C).center.distance(C))
print("#問題2",Circle(O,E,C).center.distance(F))
# 
print("#問題3",                                             Circle(O,P,C).center.distance(O))
print("#問題3",sqrtdenest(Circle(O,P,C).center.distance(P)),Circle(O,P,C).center.distance(P))
print("#問題3",                                             Circle(O,P,C).center.distance(C))
print("#問題3",sqrtdenest(Circle(O,P,C).center.distance(Q)),Circle(O,P,C).center.distance(Q))
#問題1 3
#問題2 sqrt(5)
#問題2 sqrt(5)
#問題2 sqrt(5)
#問題2 sqrt(5)
#問題3 sqrt(65)/3
#問題3 sqrt(65)/3 sqrt((47/195 - 32*sqrt(14)/65)**2 + (4*sqrt(14)/65 + 376/195)**2)
#問題3 sqrt(65)/3
#問題3 sqrt(65)/3 sqrt((376/195 - 4*sqrt(14)/65)**2 + (47/195 + 32*sqrt(14)/65)**2)

FreeCADのマクロで作図

問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
def myTriangle_Move_IncenterToOrigin(dumABC):
    dumO=dumABC.incircle.args[0]
    return Triangle( dumABC.vertices[0]-dumO,
                     dumABC.vertices[1]-dumO,
                     dumABC.vertices[2]-dumO )
def myArgs3(dumABC):
    return dumABC.args[0],dumABC.args[1],dumABC.args[2]
def myUnitVector(u):
    return u/(Point(0,0).distance(u))
(AB,BC,CA) =(8,10,6)
(O),(B,C,A)=(Point(0,0)),(myArgs3( myTriangle_Move_IncenterToOrigin( Triangle(sss=(BC,CA,AB) ) )))
# print("#",Polygon(A,B,C).angles[A])  # pi/2
D=Line(A,B).intersection(Line(C,C+myUnitVector(A-C)+myUnitVector(B-C) ) )[0]
E=Line(C,A).projection(O)
F=Line(B,C).projection(O)
G=Line(C,D).intersection(Line(E,F))[0]
H=Line(B,C).intersection(Line(A,G))[0]
(P,Q)=Circle(Triangle(A,B,C).incircle.args[0],Triangle(A,B,C).inradius).intersection( Line(A,H))
print("#問題1",A.distance(D))
# 
print("#問題2",Circle(O,E,C).center.distance(O))
print("#問題2",Circle(O,E,C).center.distance(E))
print("#問題2",Circle(O,E,C).center.distance(C))
print("#問題2",Circle(O,E,C).center.distance(F))
# 
print("#問題3",                                             Circle(O,P,C).center.distance(O))
print("#問題3",sqrtdenest(Circle(O,P,C).center.distance(P)),Circle(O,P,C).center.distance(P))
print("#問題3",                                             Circle(O,P,C).center.distance(C))
print("#問題3",sqrtdenest(Circle(O,P,C).center.distance(Q)),Circle(O,P,C).center.distance(Q))
#問題1 3
#問題2 sqrt(5)
#問題2 sqrt(5)
#問題2 sqrt(5)
#問題2 sqrt(5)
#問題3 sqrt(65)/3
#問題3 sqrt(65)/3 sqrt((47/195 - 32*sqrt(14)/65)**2 + (4*sqrt(14)/65 + 376/195)**2)
#問題3 sqrt(65)/3
#問題3 sqrt(65)/3 sqrt((376/195 - 4*sqrt(14)/65)**2 + (47/195 + 32*sqrt(14)/65)**2)
############################################################################
# 作図用
myCi_1=Circle( Circle(O,E,C).center,Circle(O,E,C).center.distance(O))
I=Circle(O,E,C).center
myCi_2=Circle( Circle(O,P,C).center,Circle(O,P,C).center.distance(O) )
J=Circle(O,P,C).center
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
############################################################################
# 円の作図 FrecCADのdocより
# https://wiki.freecad.org/Macro_Circle
def Freecad3D_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(myCi):
    x=myCi.center.x
    y=myCi.center.y
    r=myCi.radius
    Freecad3D_circle(
           x=float(x),y=float(y),z=0.0,
           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) +  ')'
    #return ""
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.3 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
#######################################################################################
myCircle_2D  ( myCi_1  )
myCircle_2D  ( myCi_2  )
myLine_C_2D  ( A,B,C)
myLine_S_2D  ( A,H )
myLine_S_2D  ( C,D )
myLine_S_2D  ( E,F )
myTxtXYZ_S_2D( O,"O",A,"A",B,"B",C,"C",D,"D",E,"E",F,"F",G,"G",H,"H",P,"P",Q,"Q" )
myTxtXYZ_S_2D( I,"I",J,"J" )
#######################################################################################
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

sympyの実行環境

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

参考

以下、いつもの?おすすめです。

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