0
0

直角を三等分する線「高校入試チャレンジ問題 △EBDの面積は?」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-08-19

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

パイソニスタの方へ
・本問題の本質は、奥が深そうなので、私が理解できれば、(その2)を投稿したいです。

オリジナル

・YUUU0123 様 (0:00〜5:34)

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

ver0.1 >2つ分を引けばいい。

# ver0.1 >2つ分を引けばいい。 
from sympy import *
var('h',real=true,positive=true)
h=solve(Eq(sqrt(3)*h,6-h),h)[0]
print("#",6*6*Rational(1,2)-2*(6*h*Rational(1,2)))
# 36 - 18*sqrt(3)

ver0.2 無理をすれば、???、代入式(h=...)なしで。print文の中に。

(省略)

ver0.3 sympyのTriangle の area。キーワードasaで。角度の単位はdegreeです。

class sympy.geometry.polygon.Triangle(*args, **kwargs)
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle
The area of the polygon.
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Polygon.area

# ver0.3 sympyのTriangle の area。キーワードasaで。角度の単位はdegreeです。
from sympy import *
print("#",Triangle(asa=(90,6,45)).area-2*Triangle(asa=(30,6,45)).area)
# 36 - 18*sqrt(3)

sympyで(いつもの方法で)

ver0.4 座標(交点計算から面積計算へ)

・FreeCADの座標に使えます。
もっと良さそうなDOCがあると思います。
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.Ray2D.closing_angle

# ver0.4 座標(交点計算から面積計算へ)
from sympy import *
d=6
A,B,C=map(Point,[(0,d),(0,0),(d,0)])
D=Line(A,C).intersection(Line(B,C).rotate(rad(30),pt=B))[0]
E=Line(A,C).intersection(Line(B,C).rotate(rad(60),pt=B))[0]
print("#",Triangle(E,B,D).area)
# 36 - 18*sqrt(3)

ver0.5 Youtubeのコメント様より。直角二等辺三角形の面積を、底辺ACの長さの按分(AC方向) とy方向?の按分(AB方向)

# ver0.5 Youtubeのコメント様より。直角二等辺三角形の面積を、底辺ACの長さの按分(AC方向) とy方向?の按分(AB方向)
from sympy import *
var('h',real=true,positive=true)
h=solve(Eq(sqrt(3)*h,6-h),h)[0]
print("#",(6*6*Rational(1,2)*(6*sqrt(2)-2*h*sqrt(2))/(6*sqrt(2))).simplify())
print("#",(6*6*Rational(1,2)*(6-2*h)/6))
# 36 - 18*sqrt(3)
# 36 - 18*sqrt(3)

FreeCADのマクロで作図

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

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.4 座標(交点計算から面積計算)
from sympy import *
d=6
A,B,C=map(Point,[(0,d),(0,0),(d,0)])
D=Line(A,C).intersection(Line(B,C).rotate(rad(30),pt=B))[0]
E=Line(A,C).intersection(Line(B,C).rotate(rad(60),pt=B))[0]
print("#",Triangle(E,B,D).area)
# 36 - 18*sqrt(3)
############################################################################
############################################################################
# 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         (A,B,C)  
myLine_S_2D         (B,D)  
myLine_S_2D         (B,E)  
myTxtXYZ_XY_S_2D   (A,"A",B,"B",C,"C",D,"D",E,"E")
####################################################################################
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