1
0

高校入試平面図形 相似「2024 愛知県高校入試 数学大問3(2)」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-03-12

パイソニスタの方へ
・ver0.2のPoint(1,0)を使わない方法を教えて下さい。angle_betweenにしました。

問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
いつものベクトルの成分表示?です。

オリジナル

中日進学ナビ 様

大問3(2)。ページの下半分です。正方形の問題です。
https://edu.chunichi.co.jp/site_home/highschool/pdf/2024_sugaku_q.pdf#page=7

東進 様

2024/03/13
現在、ご利用いただけない状態となっております。
時間を置いて再度ご利用願います。

大問3(2)。ページの下半分です。正方形の問題です。
https://www.toshin.com/koukou_nyushi/files/2024/sugaku_q/aichi_sugaku_q.pdf#page=7
<2024年全国公立高校入試解答速報|大学受験の予備校・塾 東進
https://www.toshin.com/koukou_nyushi/

東亜紗美moveforward数学教室 様

youtube 大問3(2)。途中からです。(1:06:07) 2024年愛知県公立高校入試<数学>解説
https://youtu.be/ogDFpAdUqW0?t=2435
>愛知県は相似が好き...
>数学には、『この問題にはこの解き方!』という制限は全くない...

sympyで(オリジナル 様のやり方で)

・ver0.1
・ADの延長とBEの延長の交点を、点Iとしました。
・この問題のポイントは、FGの長さです。
 裏返しの相似でした。「この記事は以下の記事からリンクされています」で。
・私は、相似の勉強中です。中点連結定理?も。

# ver0.1
from sympy import *
var('FG,HF',real=True,nonnegative=True)
d  =4
EB=sqrt(d**2+(Rational(1,2)*d)**2) 
EF=EB/2 
# 
AB=d
BF=EF
AF=sqrt(AB**2-BF**2)
IA=2*d
IF=EF*3
FG=solve(Eq(IA/AF,IF/FG),FG)[0]
HF=solve(Eq( 2/AF,HF/FG),HF)[0]
# 
print("# ア  ", EF   )
print("# イウ", HF/EB) 
# ア   sqrt(5)
# イウ 3/8

sympyで(いつものやり方で)

・ver0.2
・ベクトルの成分表示です。
Point angle_between(l2)
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.LinearEntity.angle_between

# ver0.2
from sympy import *
var('d,θ',real=True,nonnegative=True)
d      =4
B,C,D,A=map(Point,[(0,0),(d,0),(d,d),(0,d)])                
E      =(D+C)/2
F      =(B+E)/2
θ     =Line(A,F).angle_between(Line(A,D))
dumθ  =Line(F,F+Point(1,0)).angle_between(Line(F,E))
dumG   =F+Point(1,0).rotate(dumθ+θ)
G      =Line(A,D).intersection(Line(F,dumG))[0]      
H      =Line(B,E).projection(G)
# 
print("# ア  ",E.distance(F) )
print("# イウ",H.distance(F)/E.distance(B) )
# ア   sqrt(5)
# イウ 3/8

・ver0.3
・sympyらしく? 最後にrepしました。比は、正方形の辺の長さと無関係でした。

# ver0.3
from sympy import *
var('d,θ',real=True,nonnegative=True)
var('d   ',real=True,nonnegative=True)
A,B,C,D=map(Point,[(0,d),(0,0),(d,0),(d,d)])                
E      =(D+C)/2
F      =(B+E)/2
θ     =Line(A,F).angle_between(Line(A,D))
dumθ  =Line(F,F+Point(1,0)).angle_between(Line(F,E))
dumG   =F+Point(1,0).rotate(dumθ+θ)
G      =Line(A,D).intersection(Line(F,dumG))[0]      
H      =Line(B,E).projection(G)
# 
print("# ア  ", E.distance(F)               )
print("# イウ", H.distance(F)/E.distance(B) )
rep    ={d:4}
print("# ア  ", E.distance(F)               .subs(rep) )
print("# イウ",(H.distance(F)/E.distance(B)).subs(rep) )
# ア   sqrt(5)*d/4
# イウ 3/8
# ア   sqrt(5)
# イウ 3/8

FreeCADのマクロで作図

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

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
var('d,θ',real=True,nonnegative=True)
d      =4
B,C,D,A=map(Point,[(0,0),(d,0),(d,d),(0,d)])                
E      =(D+C)/2
F      =(B+E)/2
θ     =Line(A,F).angle_between(Line(A,D))
dumθ  =Line(F,F+Point(1,0)).angle_between(Line(F,E))
dumG   =F+Point(1,0).rotate(dumθ+θ)
G      =Line(A,D).intersection(Line(F,dumG))[0]      
H      =Line(B,E).projection(G)
############################################################################
# 作図用
############################################################################
# 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.3 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
########################################################################################
myLine_C_2D (A,B,C,D)
myLine_S_2D (B,E)
myLine_S_2D (A,F,G,H)
myTxtXYZ_S_2D(A,"A",B,"B",C,"C",D,"D",E,"E",F,"F",G,"G",H,"H",)
#######################################################################################
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
App.ActiveDocument.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
・isometric方向です。
1.png
・上空からです。拡大図
・Originは、マウス操作で非表示です。
2.png

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

(テンプレート)

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

「この記事は以下の記事からリンクされています」で。

1
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
1
0