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 大阪府高校入試 数学C大問2」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-03-16

最初に

私の解答の方法は、中学生の学習指導要領の範囲外です。
長文です。
アドバイスをいただけると幸いです。いつもの? ベクトル成分表示です。

・最初、私は 「円周角、相似、直角三角形,二等辺三角形」 をわからず、
 sympyでver0.1小問(2) を作成しました。
・youtube ニッキーランド 様を何回も視聴しました。
 sympyでver0.2小問(1)(2) を作成しました。
・相似を勉強して、ver0.1小問(1)相似を追加して仕上げました。
・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。

私は今回、相似も円周角も直角三角形二等辺三角形もわかっていないのに、
sympyの威力を再確認できました。
(問題文通りに入力です。例.大学入試問題は、chatgpt,mathmlの読み込みです。)
ありがとうございました。

オリジナル

PDF

大問2
https://www.toshin.com/koukou_nyushi/files/2024/sugaku_q/osaka_sugaku_q.pdf#page=14
<2024年全国公立高校入試解答速報|大学受験の予備校・塾 東進
https://www.toshin.com/koukou_nyushi/

youtube

大ヒーント

三角形オールスター?
以下は、ニッキーランド 様を抜粋
>情報が1個増えてます。
>大体これを使います。
>恐らくこれを使っていませんので、これを使うんじゃないかなあ。
>数学的...
>ここの直角三角形を使うんじゃないかなあ。
>あとは、ここだけほしい。
>もう見えてきましたね。
>この発見が難しい。
>注目して下さい。

大手 様より
>難易度は昨年度並み
???毎年どんな問題がでているのでしょうか?私の勉強不足です。

ニッキーランド 様

youtube (08:51)

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

・ver0.2 もっとEq,solveを使った方がよかったです。

# ver0.2
from sympy import *
var('a,θ,DBC,FO',real=True,positive=True)
BC=4
R =Rational(BC/2)
DOB=θ ;BOA=2*θ;BCA=θ;ECA=BCA
DBO=DBC;DAC=DBC ;EAC=DAC
BE =1
EC =BC-BE
AC =EC
AB =sqrt(BC**2-AC**2)
FCO=ECA
FOC=DOB 
OA =R 
OC =R 
FO =solve(Eq(AC/OA,OC/FO),FO)[0]
FC =FO
AF =AC-FC
BF =sqrt(AB**2+AF**2)
print("#(1)①",pi*R**2*a*Rational(1,360))
print("#(1)➁",Eq(DOB,ECA),Eq(DBO,EAC))
print("#(2)①",AB)
print("#(2)➁",BF)
#(1)① pi*a/90
#(1)➁ True True
#(2)① sqrt(7)
#(2)➁ 2*sqrt(22)/3

sympyで(いつもの方法で)

・ver0.1
・相似
sympy.geometry.util.are_similar(e1, e2)
https://docs.sympy.org/latest/modules/geometry/utils.html#sympy.geometry.util.are_similar
solveをsolvesetにしました。
are_similarは、sssにしました。

from sympy import *
var('a',real=True,positive=True)
BC=4
R =Rational(BC/2)
O=Point( 0,0)
C=Point( R,0)   
D=Point( R*cos((360-a)/180*pi),R*sin((360-a)/180*pi))            
B=Point(-R,0)            
A=Point( R*cos((360-a-(180-a)*3)/180*pi),R*sin( (360-a-(180-a)*3)/180*pi))            
E=Line (B,C).intersection(Line(A,D))[0] 
#  
print("#(1)①",pi*R**2*a*Rational(1,360))
print("#(1)➁ error",are_similar(Triangle(B,D,O),Triangle(A,E,C) ))
print("#(1)➁ ok   ",are_similar(Triangle( sss=(B.distance(D),D.distance(O),B.distance(B) )),
                                 Triangle( sss=(B.distance(D),D.distance(O),B.distance(B) ) )))
# 
BE=1
rep={a:solveset(Eq(B.distance(E),BE),a,Interval(0,180)).args[0]}           
A=A.subs(rep).simplify()
B=B.subs(rep).simplify()
F=Line(A,C).intersection(Line(D,O))[0].subs(rep).simplify()
print("#(2)➀",A.distance(B).simplify())
print("#(2)➁",B.distance(F).simplify())
# 
# #(1)① pi*a/90
# #(1)➁ error False
# #(1)➁ ok    True
# #(2)➀ sqrt(7)
# #(2)➁ 2*sqrt(22)/3
# [Done] exited with code=0 in 58.741 seconds

D=A.subs(rep).simplify()
E=B.subs(rep).simplify()

FreeCADのマクロで作図

・計算部分は、コピー貼り付けです。
・実行時間は、約3分です。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# 計算
from sympy import *
var('a',real=True,positive=True)
BC=4
R =Rational(BC/2)
O=Point( 0,0)
C=Point( R,0)   
D=Point( R*cos((360-a)/180*pi),R*sin((360-a)/180*pi))            
B=Point(-R,0)            
A=Point( R*cos((360-a-(180-a)*3)/180*pi),R*sin( (360-a-(180-a)*3)/180*pi))            
E=Line (B,C).intersection(Line(A,D))[0] 
#  
print("#(1)①",pi*R**2*a*Rational(1,360))
print("#(1)➁ error",are_similar(Triangle(B,D,O),Triangle(A,E,C) ))
print("#(1)➁ ok   ",are_similar(Triangle( sss=(B.distance(D),D.distance(O),B.distance(B) )),
                                 Triangle( sss=(B.distance(D),D.distance(O),B.distance(B) ) )))
# 
BE=1
rep={a:solveset(Eq(B.distance(E),BE),a,Interval(0,180)).args[0]}           
A=A.subs(rep).simplify()
B=B.subs(rep).simplify()
F=Line(A,C).intersection(Line(D,O))[0].subs(rep).simplify()
print("#(2)➀",A.distance(B).simplify())
print("#(2)➁",B.distance(F).simplify())
# 
# #(1)① pi*a/90
# #(1)➁ error False
# #(1)➁ ok    True
# #(2)➀ sqrt(7)
# #(2)➁ 2*sqrt(22)/3
# [Done] exited with code=0 in 58.741 seconds

D=A.subs(rep).simplify()
E=B.subs(rep).simplify()
############################################################################
# 作図用
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
# 円の作図 FrecCADのdocより
# https://wiki.freecad.org/Macro_Circle
def Freecad3D_circle(x=0.0,y=0.0,z=0.0,radius=0.0,diameter=0.0,circumference=0.0,area=0.0,startangle=0.0,endangle=0.0,arc=0.0,anglecenter=0.0,cord=0.0,arrow=0.0,center=0,placemObject=""):
    from math import sqrt, pi
    if placemObject == "":
        pl = FreeCAD.Placement()
        pl.Rotation = FreeCADGui.ActiveDocument.ActiveView.getCameraOrientation()   
        pl.Base = FreeCAD.Vector(x,y,z)
    else:
        pl = FreeCAD.Placement()
        pl = placemObject                                  # placement imposted
    if diameter != 0:                                      # with diameter
        radius = diameter / 2.0
    elif circumference != 0:                               # with circumference
        radius = (circumference / pi) / 2.0
    elif area != 0:                                        # with area
        radius =  sqrt((area / pi))
    elif (cord != 0) and (arrow != 0):                     # with cord and arrow
        radius = ((arrow**2) + (cord**2) / 4.0) / (arrow*2) 
    elif (arc != 0) and (anglecenter != 0):                # with arc and anglecenter central in degrees
        radius = ((360/anglecenter)*arc) / pi/2.0
        if endangle != 0:
            startangle  = endangle - anglecenter
        endangle   = anglecenter + startangle
        startangle  = endangle - anglecenter
    if radius != 0:
        try:
            Draft.makeCircle(radius,placement=pl,face=False,startangle=startangle,endangle=endangle,support=None)
            if center != 0:
                x=pl.Base.x
                y=pl.Base.y
                z=pl.Base.z
                Draft.makePoint(x,y,z)
        except Exception:
            App.Console.PrintError("Unexpected keyword argument" + "\n")
        App.ActiveDocument.recompute()
    else:
        App.Console.PrintMessage("Unexpected keyword argument" + "\n")
        App.Console.PrintMessage("circle(x,y,z,radius,diameter,circumference,area,startangle,endangle,[arc,anglecenter],[cord,arrow],center,placemObject)" + "\n")
        App.Console.PrintMessage("circle(radius=10.0,placemObject=App.Placement(App.Vector(11,20,30), App.Rotation(30,40,0), App.Vector(0,0,0)))" + "\n")
    return
def myCircle_2D(myCi):
    x=myCi.center.x
    y=myCi.center.y
    r=myCi.radius
    Freecad3D_circle(
           x=float(x),y=float(y),z=0.0,
           radius=float(abs(r)),
           center=1,
           placemObject=App.Placement(App.Vector(float(x),float(y),0),
           App.Rotation(0,0,0),App.Vector(0,0,0)))
    return
############################################################################
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  (B,A,C)
myLine_C_2D  (O,D,A)
myLine_S_2D  (B,D)
myLine_S_2D  (O,F,B)
myTxtXYZ_S_2D(O,"O",A,"A",B,"B",C,"C",D,"D",E,"E",F,"F")
myCircle_2D      (Circle(Point(0, 0), R)) 
#######################################################################################
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は、マウス操作で非表示です。
・寸法、角度表示勉強中です。

3.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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?