0
0

正三角形の辺の長さ「高校入試チャレンジ問題 BFの長さは?」をWolframAlphaとsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-08-18

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

オリジナル

・YUUU0123 様 (0:00〜2:18)

WolframAlphaで

・私が最初に思いついた方法です。
 ベクトルで??? 点B(0,0) y座標に注目。
 BD.y+DE.y-CE.y=0 (同じです。BD.y+DE.y+EC.y=0)

解 x = 5

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

ver0.1 正三角形なので。

・print文が1行でわかりにくくて、申し訳ありません。私は、困ったらsolveです。
 https://docs.sympy.org/latest/modules/solvers/solvers.html

# ver0.1 正三角形なので。
from sympy import *
var('a',real=true,positive=true)
print("#",solve(Eq(2*a+1,a+2*2),a)[0]+4-2)
# 5

sympyで(いつもの方法で)

ver0.2 ベクトルで。三角関数で多角形BDEFCの一周です。

・FreeCADの座標に使えます。

# ver0.2 ベクトルで。三角関数で多角形BDEFCの一周です。
from sympy import *
var('x,DF',real=true,positive=true)
DB,FC=1,2
O=  Point(0,0)
D=O+Point(DB     *cos(rad(60))   ,DB     *sin(rad(60))   )
E=D+Point((x-D.x)                ,(x-D.x)*tan(rad(90-60)))
C=E+Point(FC*2   *cos(rad(  -60)), FC*2  *sin(rad(  -60)))
F=C+Point(-2,0)
B=F+Point(-x,0)
print("#",solve([Eq(B.x,0),Eq(B.y,0)],x)[x])
# 5

ver0.3 無理をすれば、1行で

(省略)

FreeCADのマクロで作図

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
・計算部分は、Ver.0.2 の コピー貼り付けです。
・subsで、全点の座標を決定しています。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.2 ベクトルで。多角形BDEFCで一周です。
from sympy import *
var('x,DF',real=true,positive=true)
DB,FC=1,2
O=  Point(0,0)
D=O+Point(DB     *cos(rad(60))   ,DB     *sin(rad(60))   )
E=D+Point((x-D.x)                ,(x-D.x)*tan(rad(90-60)))
C=E+Point(FC*2   *cos(rad(  -60)), FC*2  *sin(rad(  -60)))
F=C+Point(-2,0)
B=F+Point(-x,0)
print("#",solve([Eq(B.x,0),Eq(B.y,0)],x)[x])
# 5
############################################################################
rep={x:solve([Eq(B.x,0),Eq(B.y,0)],x)[x]}
A=Point((x+2)/2,(x+2)/2*sqrt(3)).subs(rep)
B=B.subs(rep)
C=C.subs(rep)
D=D.subs(rep)
E=E.subs(rep)
F=F.subs(rep)
############################################################################
# 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,D,A,E,C,F)  
myLine_S_2D     (D,E,F)  
myTxtXYZ_XY_S_2D(A,"A",B,"B",C,"C",D,"D")
myTxtXYZ_XY_S_2D(E,"E",F,"F")
####################################################################################
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の操作で寸法線を追加)
・(青色の)角度寸法は、ニセモノです。Part>計測>角度計算 です。
・角度寸法の表示は、まだ勉強中です。

3.png

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

(テンプレート)

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

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

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