0
0

直角三角形の中に直角三角形「高校入試チャレンジ問題 補助線をうまく使おう」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-09-11

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

オリジナル

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

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

ver0.1 合同で

# ver0.1 合同で
from sympy import *
var('a',real=True,positive=True)
AB,DC=6,10
print("#",sqrt(solve(Eq(a/6,(DC-AB)/(10+a)),a)[0]**2+AB**2))
# # 2*sqrt(10)

sympyで(いつもの方法で)

ver 0.2 一歩ずつ.円と平行線の交点計算

・△ADCの外接円と平行線の交点が点A。原点は点C.
・円周角∠∠DACの中心角90°で直角二等辺三角形。頂点Mが△ADCの外接円の中心

# ver0.2 一歩ずつ.円と平行線の交点計算
from sympy import *
var('r',real=True,positive=True)
AB,DC,degDAC=6,10,45
D,C,M=map(Point,[(0,0),(DC,0),(DC/2,DC/2)])
A=Circle(M,DC/2*sqrt(2)).intersection(Line(C+Point(0,AB),C+Point(1,AB)))[0]
print("#",A.distance(D))
# 2*sqrt(10)

ver 0.3 正弦定理で

・△ADCの座標のcircumradiusと△ADCの正弦定理の半径が同じ。原点は点C.
property circumradius
The radius of the circumcircle of the triangle.
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle.circumradius

# ver0.3 正弦定理で
from sympy import *
var('Ax',real=True)
AB,DC,degDAC=6,10,45
D,C,A=map(Point,[(0,0),(DC,0),(Ax,AB)])
A=A.subs({Ax:solve(Eq(Triangle(C,D,A).circumradius,(DC/sin(rad(45))/2)),Ax)[0]})
print("#",A.distance(D),float(A.distance(D)))
# 2*sqrt(10) 6.324555320336759

FreeCADのマクロで作図

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面に作図しました。
・計算部分は、Ver.0.3 の コピー貼り付けです。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.3 正弦定理で
# △ADCの座標のcircumradiusと△ADCの正弦定理の半径が同じ。原点は点C.
from sympy import *
var('Ax',real=True)
AB,DC,degDAC=6,10,45
D,C,A=map(Point,[(0,0),(DC,0),(Ax,AB)])
A=A.subs({Ax:solve(Eq(Triangle(C,D,A).circumradius,(DC/sin(rad(45))/2)),Ax)[0]})
print("#",A.distance(D),float(A.distance(D)))
# 2*sqrt(10) 6.324555320336759
########################################################################### 
B=Point(A.x,0)
############################################################################
# 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 = '0.7 mm'
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = '1.0 mm'
    # FreeCADGui.ActiveDocument.ActiveObject.FontSize = '1.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 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     (A,B,D,C)  
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の操作で寸法線を追加)
・(青色の)角度寸法は、ニセモノです。Part>計測>角度計算 です。
・角度寸法の表示は、まだ勉強中です。
・文字Bは、CADのプロパティで動かしました。CAD操作はまだです。
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