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

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

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

# オリジナル
#### 中日進学ナビ 様
**大問３(2)**。ページの下半分です。正方形の問題です。
https://edu.chunichi.co.jp/site_home/highschool/pdf/2024_sugaku_q.pdf#page=7

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

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

# sympyで(オリジナル 様のやり方で)
・ver0.1
・ADの延長とBEの延長の交点を、点Iとしました。
・この問題のポイントは、FGの長さです。
　**裏返しの相似**でした。「この記事は以下の記事からリンクされています」で。
・私は、相似の勉強中です。中点連結定理？も。
```python
# 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
```python
# 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しました。比は、正方形の辺の長さと無関係でした。
```python
# 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のマクロで作図
・計算部分は、コピー貼り付けです。
```python
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次元ですが、３次元FreeCADのマクロで、XY平面上に作図しました。
・isometric方向です。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/134a3c77-577b-8e33-e735-0f3b94bb1611.png)
・上空からです。拡大図
・Originは、マウス操作で非表示です。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/c5411fd9-f5d5-277d-d266-46aa3ce80ac7.png)

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

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

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