1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-05-31

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

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

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

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

オリジナル

PDF 最終問題【8】、2ページ目右下
 https://www.yotsuyaotsuka.com/chugaku_kakomon/pc/uploadPdfs/130/2024/sansu-mondai.pdf#page=2

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

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

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

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

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

・ver0.1

# 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

# 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の正弦定理から開始して,長さの差の方程式で終了です。

# 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
 できませんでした。 うまくいくと思ったんですけど。
 やっぱりコレ。ベクトルで作図したいです。

# 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次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。
・いつもだと「マクロプログラムの計算部分は、コピーしています。」
 今回は、座標計算部分は、新規作成です。 ver0.3の修正です。

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

拡大図

2.png

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

3.png

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

(テンプレート)

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

終わってから大ヒーント

ポイントは問題文にも、ありました。
一目で一本の補助線が浮かぶ人には、以下の説明は不要です。

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

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

1
0
1

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?