0
0

More than 1 year has passed since last update.

角の二等分線の定理「2019 青森公立大学前期経営経済学部【3】」をsympyとFreeCADでやってみたい。9元連立方程式あり

Last updated at Posted at 2023-08-12

難しいです。
通常、辺ABの長さ、辺BCの長さ、辺CA長さ → 外接円の半径
今回、辺ABの長さ、辺CA長さ、外接円の半径 → 辺BCの長さ

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
 いつものベクトルの成分表示?です。
・正弦定理でやりました。方ベキの定理、トレミーの定理は勉強中です。
 使っていないつもりです。
・>中3の平行線と線分の比の単元で, 角の二等分線と線分の比も学習します。
 角の二等分線の定理を覚えました。

オリジナル

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

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

この問題のポイントは、2つ。
①CAとRに数字13があるので、Bの角度をまず求める。正弦定理で。
 (私は、理解できていませんでした。)
➁角の2等分線の定理です。
 2通りあるみたいです。方ベキの定理、トレミーの定理は勉強中です。

sympyで(正弦定理と角の2等分線の定理で)

・正弦定理で、3つの角度をsinの逆関数で計算しました。
・角の2等分線の定理の比を、(苦肉の策で) 掛け算にしました。
 割り算だと小数になりました。いい方法がありますか?
・symbolの書き方について、いい方法がありませんか?
・varのオプションに,realがあるそうです。(2023/08/12コメントあり)
 varのデフォールトは、複素数です。

from sympy import *
BC     =symbols('BC'     ,real=True,nonnegative=True)
Sin_ABC=symbols('Sin_ABC',real=True,nonnegative=True)
Sin_BCA=symbols('Sin_BCA',real=True,nonnegative=True)
Sin_CAB=symbols('Sin_CAB',real=True,nonnegative=True)
BD,DC  =symbols('BD,DC'  ,real=True,nonnegative=True)
AD     =symbols('AD'     ,real=True,nonnegative=True)
BE     =symbols('BE'     ,real=True,nonnegative=True)
# 
(AB,CA,R)=(7,13,Rational(1,3)*13*sqrt(3))
Rad_ABC=asin( solve( Eq(CA/Sin_ABC,2*R) ,Sin_ABC)[0] )
Rad_BCA=asin( solve( Eq(AB/Sin_BCA,2*R) ,Sin_BCA)[0] )
Rad_CAB=pi-Rad_ABC-Rad_BCA
BC=solve( Eq(BC/sin(Rad_CAB),2*R),BC )[0]
# BD=solve([Eq(AB/CA,BD/DC),Eq(BC,BD+DC)],[BD,DC])[BD]  # 苦肉の策
BD_DC=solve([Eq(AB*DC,BD*CA),Eq(BC,BD+DC)],[BD,DC])
AD=solve(Eq(AB**2+BD_DC[BD]**2-2*AB*BD_DC[BD]*cos(Rad_ABC),AD**2),AD)[0]
# 
print("#(1)",BC)
print("#(2)",AD)
print("#(3)",solve(Eq(BE/CA,BD_DC[BD]/AD),BE)[0])
#(1) 15
#(2) 7*sqrt(13)/4
#(3) 3*sqrt(13)

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

大人になると、作図?CAD風です。 まず、辺BCの長さを求めるため、
半径13√3/3の円を書く。
その円上の点Cで、半径13の円を書く。交点を点Aとする。
点Aで、半径7の円を書く。交点を点Bとする。三角形ABCができた。
辺BCの長さを測る。三辺の長さがそろった。
三角形ABCを移動回転して、正しい?向きにする。
全点の座標計算終了です。あとは「長さを求めよ」です。

角の二等分線は単位ベクトルの和?です。

from sympy import *
def myUnitVector(u):
    return u/Point(0,0).distance(u)
(AB,CA,R)=(7,13,Rational(1,3)*13*sqrt(3))
O    =Point (0,0)
dum_1=Point (R,0)
dum_2=Circle(O,R).intersection(Circle(dum_1,CA))[1]
dum_3=Circle(O,R).intersection(Circle(dum_2,AB))[0]
BC=dum_3.distance(dum_1)
# 
myT=Triangle(sss=(BC,CA,AB))
myC=Triangle(sss=(BC,CA,AB)).circumcenter
B=myT.args[0]-myC
C=myT.args[1]-myC
A=myT.args[2]-myC
#
D=Line(B,C)   .intersection(Line(A,A+(myUnitVector(B-A)+myUnitVector(C-A))))[0]
E=Circle(O,R) .intersection(Line(A,D)                                      )[1]
print("#(1)",B.distance(C))
print("#(2)",A.distance(D))
print("#(3)",B.distance(E))
#(1) 15
#(2) 7*sqrt(13)/4
#(3) 3*sqrt(13)

sympyで(solve一発?で、できませんでした。)

以下のプログラムは終了しません。当初です。そんなに甘くありませんでした。
そもそも、sssは値がはいっていないと、うごきません。

from sympy import *
BC=symbols('BC',real=True,nonnegative=True)
(AB,CA,R)=(7,13,Rational(1,3)*13*sqrt(3))
#print(Triangle(sss=(3,4,5)   ).circumradius)
print(Triangle(sss=(AB,BC,CA)).circumradius)
print(solve(Triangle(sss=(AB,BC,CA)).circumradius,R),BC))

FreeCADのマクロで作図

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

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
def myUnitVector(u):
    return u/Point(0,0).distance(u)
(AB,CA,R)=(7,13,Rational(1,3)*13*sqrt(3))
O=Point(0,0)
dum_1=Point (R,0)
dum_2=Circle(O,R).intersection(Circle(dum_1,CA))[1]
dum_3=Circle(O,R).intersection(Circle(dum_2,AB))[0]
BC=dum_3.distance(dum_1)
# 
myT=Triangle(sss=(BC,CA,AB))
myC=Triangle(sss=(BC,CA,AB)).circumcenter
B=myT.args[0]-myC
C=myT.args[1]-myC
A=myT.args[2]-myC
#
D=Line(B,C)   .intersection(Line(A,A+(myUnitVector(B-A)+myUnitVector(C-A))))[0]
E=Circle(O,R) .intersection(Line(A,D)                                      )[1]
print("#(1)",B.distance(C))
print("#(2)",A.distance(D))
print("#(3)",B.distance(E))
#(1) 15
#(2) 7*sqrt(13)/4
#(3) 3*sqrt(13)
############################################################################
# 作図用
myCi=Circle(O,R)
############################################################################
# 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.7 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_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 )
myLine_C_2D  ( A,B,C )
myLine_2D    ( A,E )
myTxtXYZ_S_2D( O,"O",A,"A",B,"B",C,"C" )
myTxtXYZ_S_2D( D,"D",E,"E" )
#######################################################################################
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
2

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