算数:中学受験平面図形の長さ「2024 東海中学入試【8】」をsympyとFreeCADでやってみたい。(その1)

・**小学生のみなさん**は、小学校でほとんど**習わない内容**を含むので、
　高校生のお兄さんお姉さんに聞いて下さい。
　**PDF問題文【8】** と本投稿の最後の節 **「終わってから大ヒーント」だけでも**
　**読んでいただけると、幸いです。**

・**続編(その2)を作成中です。**
　(共通テストで登場されている)太郎さんと花子さんの会話のパクリ編???予定です。

・私ができなかったプログラムも、そのまま載せています。
・問題文は2次元ですが、３次元FreeCADのマクロで、XY平面上に作図しました。

・**パイソニスタの方へ**
　(再)最後の角度の計算について、私は勉強中です。
　sin20 sin40 cos40
　https://qiita.com/mrrclb48z/items/62a90fce3dc5aef2fa16
　(新)どなたか、**ソルバー(エクセルのソルバーを含む)** でチャレンジをお願いします。2,3行で???

 # オリジナル
・**PD**F　最終問題【8】、2ページ目右下
　https://www.yotsuyaotsuka.com/chugaku_kakomon/pc/uploadPdfs/130/2024/sansu-mondai.pdf#page=2

 
・解答 ameblo 
　らふわく 様ありがとうございます。(amebloのログイン勉強中)　
　私は **【解法１】** のみ、理解できました。

　https://ameblo.jp/daigorobe/entry-12839262042.html

・解答 
　以下のyoutubeを繰り返し見て勉強しました。ありがとうございました。
　(0:00〜10:54) 解説 3:30〜

https://youtu.be/VYLZ5zKY7Pg

　youtube 他多数
　対称性でもできるそうです。私は理解できませんでした。

# sympyで(オリジナル 様の方法で)

**・ver0.1**
```python
# ver0.1
from sympy import *
var('BE,BC,AD',real=True,nonnegative=True)
print("#",solve([Eq(BC-AD,5),Eq(BC,BE+BE+(BE+AD))],[BE,AD])[BE])                                 
# 5/3
```
**・ver0.2**
　プログラムでは、ありません。print文の羅列です。
　いい方法がありますか。ver0.1に,Triangleをつけました。
＞sympy docより
Triangle(*args, **kwargs)＜Polygonsの特殊型？？？
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Triangle 
```python
# ver0.2
from sympy import *
var('BE'               ,real=True,nonnegative=True)
var('AB,BC,AC,CD,AD,DE',real=True,nonnegative=True)
AC=AB
tABE=Triangle(asa=(20,AB,40))
tCDF=Triangle(asa=(20,CD,180-(180-20)*Rational(1,2)-60))
print("#","△ABE=△CDF",are_similar(tABE,tCDF)) 
print("#","AE=FC     True") 
degDEF=20+40
degEDF=60
print("#","degDEF,degEDF=",degDEF,degEDF ) 
print("#","BE=DF     True") 
print("#","BE=DF=EF  True") 
EF=DE=BE
AE=AD+DE
FC=AE
print("#",solve([Eq(BC-AD,5),Eq(BC,BE+EF+FC)],[BE,AD])[BE])                                 
# △ABE=△CDF True
# AE=FC     True
# degDEF,degEDF= 60 60
# BE=DF     True
# BE=DF=EF  True
# 5/3
```

# sympyで(いつもの方法で)
＞sympy docより
https://docs.sympy.org/latest/tutorials/intro-tutorial/simplification.html

**・ver0.3**
　**正弦定理**を使っています。
 　BEの正弦定理から開始して,長さの差の方程式で終了です。
```python
# ver0.3 
from sympy import *
var('BE'            ,real=True,nonnegative=True)
var('AB,BC,CA,CD,AD',real=True,nonnegative=True)
def sind(deg):
    return sin(deg*pi/180) 
AB=solve(Eq(BE/sind(20),AB/sind(120)),AB)[0]
BC=solve(Eq(AB/sind(40),BC/sind(100)),BC)[0] 
CA=AB
AD=solve(Eq(CA/sind(80),AD/sind( 20)),AD)[0]
BE=solve(Eq(BC-AD      ,5           ),BE)[0]
print("#",BE,float(BE))
# 積和の公式できていません。??? 
def myPrint(BE):
    A=pi/9;B=2*pi/9;C=pi/18
    return 40*sqrt(3)*simplify(Rational(1,2)*(cos(A-B)-cos(A+B))*cos(C))/9
print("#",myPrint(BE))               
# 40*sqrt(3)*sin(pi/9)*sin(2*pi/9)*cos(pi/18)/9 1.6666666666666667
# 5/3
```
**・ver0.4**
　**できませんでした。** うまくいくと思ったんですけど。
　やっぱりコレ。**ベクトル**で作図したいです。
```python
# ver0.4 AB=AC=CD,BC-AD=5
from sympy import *
var('d',real=True,nonnegative=True)
def myUnitVector(v):
    return Point(v.x/sqrt(v.x**2+v.y**2),v.y/sqrt(v.x**2+v.y**2)   )
AB,AC,CD     =d,d,d
degBAC,degDCA=100,20
degABC       =Rational(1,2)*(180-degBAC)
# 
A=  AB*Point(cos(     degABC        *pi/180)  ,sin(     degABC        *pi/180))
B=     Point(0                                ,0)
C=  AB*Point(cos(     degABC        *pi/180)*2,0)
# 方向角で
# D=C+AB*Point(cos((180-degABC+degDCA)*pi/180)  ,sin((180-degABC+degDCA)*pi/180))
# print(E)
# 単位ベクトルで
D  =C+CD*myUnitVector( Rational(1,2)*( (A-C)+(B-C) ))
E  =Line(B,C).intersection(Line(A,D))[0]
sol=solve(Eq(B.distance(C)-A.distance(D),5),d)[0]
print("#",sol,float(sol))
rep={d:sol}
B  =B.subs(rep)
E  =E.subs(rep)
print("#",      B.distance(E)  )
print("#",float(B.distance(E)) )
# TypeError: Cannot convert complex to float
```

# FreeCADのマクロで作図
・**BE=5/3で作図しています。**
・問題文は2次元ですが、３次元FreeCADのマクロで、XY平面上に作図しました。
・いつもだと「マクロプログラムの計算部分は、コピーしています。」
　**今回は、座標計算部分は、新規作成です。** ver0.3の修正です。
```python
import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 新規計算
from sympy import *
var('BE'            ,real=True,nonnegative=True)
var('AB,BC,CA,CD,AD',real=True,nonnegative=True)
def sind(deg):
    return sin(deg*pi/180) 
AB=solve(Eq(BE/sind(20),AB/sind(120)),AB)[0]
BC=solve(Eq(AB/sind(40),BC/sind(100)),BC)[0] 
CA=AB
AD=solve(Eq(CA/sind(80),AD/sind( 20)),AD)[0]
BE=solve(Eq(BC-AD      ,5           ),BE)[0]
print("#",BE,float(BE))
# 積和の公式できていません。??? 
def myPrint(BE):
    A=pi/9;B=2*pi/9;C=pi/18
    return 40*sqrt(3)*simplify(Rational(1,2)*(cos(A-B)-cos(A+B))*cos(C))/9
print("#",myPrint(BE))               
print("------------------------------------------------------------------")
BE=myPrint(BE)
def myLineIntersection(a,dega,b,degb):
    return Line(a,a+Point(cos(rad(dega)),sin(rad(dega)))).intersection(
           Line(b,b+Point(cos(rad(degb)),sin(rad(degb))))               )[0]
B =Point(0 ,0)
E =Point(BE,0)
F =Point(BE*2,0)
A =myLineIntersection(B,40,E, 60) 
C =myLineIntersection(B, 0,A,320) 
D =myLineIntersection(E,60,C,160) 
############################################################################
# 作図用
############################################################################
# 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.1 mm'
    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)
myLine_S_2D  (A,D,E)
myLine_S_2D  (C,D)
myLine_S_2D  (D,F)
myTxtXYZ_S_2D(A,"A",B,"B",C,"C" )
myTxtXYZ_S_2D(D,"D",E,"E",F,"F" )
#######################################################################################
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")
```

isometric方向?です。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/4497d115-2d29-17a6-b2ac-7ebeed034994.png)

拡大図

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/a082e9ae-783b-2c47-eab1-0a225e277232.png)

拡大図(CADの操作で寸法線を追加)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/20acab3e-e902-7b40-6931-fc06e00808dd.png)

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

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

https://qiita.com/mrrclb48z/items/d46183cd3864ed4e999f



# 終わってから大ヒーント
・**ポイントは問題文**にも、ありました。
 一目で一本の補助線が浮かぶ人には、以下の説明は不要です。


BCとADの長さの差が5cmのとき、...
　　　　↓
CBとADの長さの差が5cmのとき、...
ADとCBの長さの差が5cmのとき、...

出題者の先生にヤラレタ感があります。


・「CBをAEに重ねるか。AEをCBに重ねるか」同じ事？
　youtube様の考え。A〜D〜E〜F〜Bを展開図(貼れる)。Fで折れ点。
　差とは何か。
　
 私の考え。**Fをもう一回伸ばして、新点Gもありかも。**
　AG=BC
　
 ameba様の考え。AEをCBに重ねる。**補助線1本だけ**いいですね～

・図を鉛直線で反転して、角度20°が左側だと、受験生にバレルかも???

・三角定規に目盛りがありましたか?
＞考査に必要な筆記用具
＞...定規（三角定規可）、...
参考図が、正確?なら、
AD,AEの長さを計って、辺CB上に点D'、点のE'のプロット作図ありかも。
https://www.tokai-jh.ed.jp/addmission/index2.html

(注意)平面図形の問題は、角度からがセオリー?だと思います。