0
0

Xの長さと長方形の面積「数学 長方形の面積 問題」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-07-22

「相似」と「一般化」の勉強中です。(2024/07/22)
・座標変換(回転)を使わなくても。錯角???を利用。

オリジナル

・数がくラブ 様 (0:00〜7:49)
>ちなみに私は学校では習わない事を含めた...

sympyで

ver0.1 CAD風に。
・2直線(半直線?)の交点計算で。線分EAを40度回転した直線EB と 直線ABの交点計算。
・CADなら速攻?
・オリジナル 様と違う補助線?
???良さそうなDOCを探しています。
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.Ray2D.closing_angle

# ver0.1 CAD風に。右上の三角形から下方向に順に。片押しで?
from sympy import *
var('X',real=True,poitive=True)
A,E=map(Point,[(-28,0),(0,-4)])
X=abs(Line(E,E+(A-E).rotate(rad(45))).intersection(Line(A,A+Point(0,-1)))[0].y)-4
print("#",X,(X+4)*28)
# 21 700

ver0.2 内角45度の方程式で
angle_between(l2)
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.LinearEntity.angle_between

# ver0.2 内角45度の方程式で
from sympy import *
var('X',real=True,poitive=True)
AD,DE,AEB=28,4,45
A,B,C,D,E=map(Point,[(-AD,0),(-AD,-DE-X),(0,-DE-X),(0,0),[0,-DE]])
sol=solve(Eq(Line(E,B).angle_between(Line(E,A)),rad(AEB)),X)[1]
print("#",sol,(sol+DE)*AD)
# 21 700

ver0.3 三角形の連結。片押し。三角形の積み木です。
・28,4の直角三角形に、45度の三角形を連結(接続)しています。
・座標変換(回転)を使っています。 何もこんな事しなくてもです。
・オリジナル 様より「平行線の錯角」を教えてもらったので。∠BAF=∠AED

(参考)

# ver0.3 三角形の連結。片押し。三角形の積み木です。
from sympy import *
var('X',real=True,poitive=True)
AD,DE,AEB=28,4,45
def myMatrixToPoint(myMatrix):    
    return Point2D(myMatrix[0],myMatrix[1])
def myPoinrToMatrix(myPoint):    
    return Matrix([[myPoint.x],[myPoint.y],[1]]) 
def myTr02(tr1,tr2):
    t     =Line(tr1.args[0],tr1.args[0]+Point(1,0)).angle_between(Line(tr1.args[0],tr1.args[2]))
    myTurn=Matrix([[cos(t),-sin(t),tr1.args[0].x],[sin(t),cos(t),tr1.args[0].y],[0,0,1]])
    return Triangle(myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[0])),
                    myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[1])),
                    myMatrixToPoint(myTurn*myPoinrToMatrix(tr2.args[2])))
A,D,E=map(Point,[(-AD,0),(0,0),[0,-DE]])
tr1=Triangle(E,D,A)
po =Polygon (E,D,A)
tr2=Triangle(asa=(45,Segment2D(E,A).length,deg(po.angles[E])))
X  =abs(myTr02(tr1,tr2).args[2].y)-4  
print("#",X,(X+DE)*AD)
# # 21 700

FreeCADのマクロで作図

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

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.2 角度45度の方程式で
from sympy import *
var('X',real=True,poitive=True)
AD,DE,AEB=28,4,45
A,B,C,D,E=map(Point,[(-AD,0),(-AD,-DE-X),(0,-DE-X),(0,0),[0,-DE]])
sol=solve(Eq(Line(E,B).angle_between(Line(E,A)),rad(AEB)),X)[1]
print("#",sol,(sol+DE)*AD)
# 21 700
############################################################################
rep={X:sol}
A,B,C,D,E=A.subs(rep),B.subs(rep),C.subs(rep),D.subs(rep),E.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,C,E,D)  
myLine_S_2D  (A,E,B)  
myTxtXYZ_S_2D(A,"A",B,"B",C,"C",D,"D")
myTxtXYZ_S_2D(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方向?です。
1.png

拡大図
2.png

拡大図(CADの操作で寸法線を追加)
・(青色の)角度寸法は、ニセモノです。Part>計測>角度計算 です。
・角度寸法の表示は、まだ勉強中です。

3.png

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

・プログラムでありません

# プログラムでありません
from sympy import *
var('BF,X',real=True,poitive=True)
AD,DE=28,4
AE=sqrt(AD**2+DE**2)                 ;print("#",AE)
BF=solve(Eq(BF/AD,(AE-BF)/DE),BF)[0] ;print("#",BF)
AB=BF*AE/AD                          ;print("#",AB)
X =AB-DE                             ;print("#",X,AB*AD)
# 20*sqrt(2)
# 35*sqrt(2)/2
# 25
# 21 700

・「相似」の勉強中です。

・「一般化」の勉強中です。
数がくラブ 様 (6:35〜)
https://youtu.be/l-00LgFuZN8?t=395

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

(テンプレート)

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

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

wikipedia

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