0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1点と直線上の3点への長さ固定「高校入試チャレンジ問題 BC=?」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-07-28

・方程式は、下側に計算しました。CAD内で、Aのy座標を、rep内で反転しています。

パイソニスタの方へ
 最初、ソルバー???
・pythonのcvxpyで見てみたいです。
 私は、cvxpyのインストールの際、pepで調整中???
・VBAのソルバーでも。私はwindowsの調整中??? 

オリジナル

・YUUU0123 様 (0:00〜3:15)

sympyで 

ver0.1 3元連立方程式

# ver0.1 3元連立方程式
from sympy import *
var('BC,Ax,Ay',real=True,poitive=True)
A,B,C,D=map(Point,[(Ax,Ay),(0,0),(BC,0),(BC/2,0)])
sol=solve([Eq(A.distance(B), 5),
           Eq(A.distance(D), 6),
           Eq(A.distance(C),13)],{BC,Ax,Ay})
print("#",sol[0])
print("#",sol[1])
print("#",sol[2])
# {Ax: -25*sqrt(61)/61, Ay: -30*sqrt(61)/61, BC: -2*sqrt(61)}
# {Ax: -25*sqrt(61)/61, Ay: 30*sqrt(61)/61, BC: -2*sqrt(61)}
# {Ax: 25*sqrt(61)/61, Ay: -30*sqrt(61)/61, BC: 2*sqrt(61)}

FreeCADのマクロで作図

・計算部分は、Ver.0.1 の コピー貼り付けです。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.1
from sympy import *
var('BC,Ax,Ay',real=True,poitive=True)
A,B,C,D=map(Point,[(Ax,Ay),(0,0),(BC,0),(BC/2,0)])
sol=solve([Eq(A.distance(B), 5),
           Eq(A.distance(D), 6),
           Eq(A.distance(C),13)],{BC,Ax,Ay})
print("#",sol[0])
print("#",sol[1])
print("#",sol[2])
# {Ax: -25*sqrt(61)/61, Ay: -30*sqrt(61)/61, BC: -2*sqrt(61)}
# {Ax: -25*sqrt(61)/61, Ay: 30*sqrt(61)/61, BC: -2*sqrt(61)}
# {Ax: 25*sqrt(61)/61, Ay: -30*sqrt(61)/61, BC: 2*sqrt(61)}
############################################################################
rep={BC:sol[2][BC],Ax:sol[2][Ax],Ay:-sol[2][Ay]}
A=A.subs(rep)
B=B.subs(rep)
C=C.subs(rep)
D=D.subs(rep)
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
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.5 mm'
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '2.0 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
def myLine_H_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[0],args[i])
    return
#######################################################################################
myLine_C_2D     (A,B,D,C)  
myLine_S_2D     (A,D)  
myTxtXYZ_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方向?です。

1.png

拡大図

2.png

拡大図(CADの操作で寸法線を追加)
・CADの操作で寸法線を赤色にした。

3.png

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

from sympy import *
AB5,AD6,AC13=5,6,13
print("#",Eq(AC13**2,AB5**2+(AD6*2)**2))
DC=sqrt(AD6**2+AB5**2)
print("#",DC*2)
# True
# 2*sqrt(61)

・SymPy Liveでも。約1分で同じ結果がでます。
https://live.sympy.org/
インストールなしで、貼り付けてできます。
環境はパソコン。???なぜか、スマホ・タブレット環境でできないと思います。
(FreeCADの作図はできません。実行環境を参考にして下さい。)

いつもの? 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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?