0
0

sympyのTRで、できませんでした。「大人も悩む算数問題 ∠ADBはいくつか?」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-08-27

・CADオペレーターなら、速攻?です。
・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。

パイソニスタの方へ
・私は、sympyのTRで、できませんでした。いい方法を教えて下さい。
 ワタシ的には、手も足もでませんでした。???ラングレー類題
 表示全部省略です。
 https://docs.sympy.org/latest/modules/simplify/fu.html

オリジナル

・YUUU0123 様 (0:00〜4:41)

sympyで(オリジナル 様の方法を参考に)

ver0.1 <合同となります。

# # ver0.1 <合同となります。 
degBCE=40             ;print("#",degBCE)
degFBC=(180-degBCE)/2 ;print("#",degFBC)
degABE=80+degFBC      ;print("#",degABE)
degADB=180-degABE     ;print("#",degADB)
# 40
# 70.0
# 150.0
# 30.0

sympyで(いつもの方法で) 全部できませんでした。

だめ(実数まで。実数のみ一致) ver0.2 基本に戻って。B→A→C→D 右回りです。

・sin(pi/18),cos(pi/18),tan(pi/9) を扱えませんでした。
・fu もわかりませんでした。(省略)

# だめ(実数まで。実数のみ一致) ver0.2 基本に戻って。B→A→C→D 右回りです。   
from sympy import *
var('AB',real=true,positive=true)
B=Point(0,0)
A=B+Point(AB*cos(rad(80)),AB*sin(rad(80)))                                          ;print("#",B)
C=Line(A,A+Point(B-A).rotate(rad(180-80-20))).intersection(Line(B,B+Point(1,0)))[0] ;print("#",C)
D=C+Point(-AB,0)                                                                    ;print("#",D)
print("#",float(Line(D,A).angle_between(Line(D,B))),float(rad(30)) )
print("#",      Line(D,A).angle_between(Line(D,B))                 )
print("#",     (Line(D,A).angle_between(Line(D,B))).simplify()     )
# Point2D(0, 0)
# Point2D(AB*(sin(pi/18) + cos(pi/18)/tan(pi/9)), 0)
# Point2D(AB*(-1 + sin(pi/18) + cos(pi/18)/tan(pi/9)), 0)
# 0.5235987755982989 0.5235987755982989
# acos(-AB*(-cos(pi/18)/tan(pi/9) + 1)/sqrt(AB**2*cos(pi/18)**2 + AB**2*(-cos(pi/18)/tan(pi/9) + 1)**2))
# acos((-tan(pi/9) + cos(pi/18))/sqrt(cos(pi/18)**2*tan(pi/9)**2 + (-cos(pi/18) + tan(pi/9))**2))

だめ(ターミナルの強制終了) ver0.3 動くと思ったんですけど

# だめ(ターミナルの強制終了) ver0.3 動くと思ったんですけど 
from sympy import *
var('x,AB,n',real=true,positive=true)
A,B,D,C=map(Point,[ (AB*cos(rad(80)),AB*sin(rad(80))),(0,0),(n*AB,0),(n*AB+AB,0)])
A1=Line(B,B+Point(1,0).rotate(rad(80    ))).intersection(Line(D,D+Point(1,0).rotate(rad(180-x))))[0]
A2=Line(C,C+Point(1,0).rotate(rad(180-20))).intersection(Line(D,D+Point(1,0).rotate(rad(180-x))))[0]
sol=solve([Eq(A.x,A1.x),Eq(A.y,A1.y),
           Eq(A.x,A2.x),Eq(A.y,A2.y)],[x,AB,n])
print(sol)

だめ(ターミナルの強制終了) ver0.4 正弦定理で

# だめ(ターミナルの強制終了) ver0.4 正弦定理で
from sympy import *
var('x,AB,AD',real=true,positive=true)
eqABD=Eq(AB/sin(x)      ,AD/sin(  rad(80)))
eqADC=Eq(AD/sin(rad(20)),AB/sin(x-rad(20)))
sol=solve([eqABD,eqADC],[AB,x])
print(sol)

だめ(ターミナルの強制終了) ver0.5 正弦定理で

# だめ(ターミナルの強制終了) ver0.5 正弦定理で
# インチキしても調子が悪い.どうしてでしょうか。
from sympy import *
var('x,AD',real=true,positive=true)
AB=10
eqABD=Eq(AB/sin(x)      ,AD/sin(  rad(80)))
eqADC=Eq(AD/sin(rad(20)),AB/sin(x-rad(20)))
sol=solve([eqABD,eqADC],[x,AD])
print("#",sol)

FreeCADのマクロで作図

・計算部分は、Ver.0.1 を使っていません。??? 解から作図です。
・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面に作図しました。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# # # ver0.1 <合同となります。 
# degBCE=40             ;print("#",degBCE)
# degFBC=(180-degBCE)/2 ;print("#",degFBC)
# degABE=80+degFBC      ;print("#",degABE)
# degADB=180-degABE     ;print("#",degADB)
# # 40
# # 70.0
# # 150.0
# # 30.0
# ###############################################################################################
from sympy import *
AB=10
B=Point(0,0)                                                                        ;print("#",B)
A=B+Point(AB*cos(rad(80)),AB*sin(rad(80)))                                          ;print("#",A)
C=Line(A,A+Point(B-A).rotate(rad(180-80-20))).intersection(Line(B,B+Point(1,0)))[0] ;print("#",C)
D=C+Point(-AB,0)                                                                    ;print("#",D)
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
def myXYZ2Txt_2D(A):
    return ""
def myXYZ2Txt_XY_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 = '1.0 mm'
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '0.5 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 myTxtXYZ_XY_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_XY_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
def myLine_H_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[0],args[i])
    return
##################################################################################
myLine_C_2D     (B,A,C,D)  
myLine_S_2D     (A,D)  
myTxtXYZ_XY_S_2D(A,"A",B,"B",C,"C",D,"D")
####################################################################################
doc = App.activeDocument()
#App.ActiveDocument.addObject("App::Origin", "Origin")
#App.ActiveDocumen!t.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")

isometric方向?です。(省略)
拡大図
2.png
拡大図(CADの操作で寸法線を追加)
・(別件)FreeCADの再インストールを、昨日したものだから、操作が若干ビミョーです。
・(青色の)角度寸法は、ニセモノです。Part>計測>角度計算 です。
・角度寸法の表示は、まだ勉強中です。

3.png

いつもの? sympyの実行環境と 参考のおすすめです。

(テンプレート)

・以下ができたら、助かります。指定と全部です

いつもと違うおすすめです。

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