0
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年秋田県高校入試数学 5-Ⅱ-(2)-② だけ」様を、計算はWolframAlphaとsympyで、作図はFreeCADとでやってみたい。

Last updated at Posted at 2025-10-10

・中学高校数学の範囲外、大人の?CADが含まれています。
 無視して下さい。得点になりません。
 問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。

オリジナル

Youtube

MAスカッと塾 様 (0:00〜5:40) いつもお世話になっております。
【ラスボス図形降臨】難解な面積比の迷宮に挑む!図形の見方が変わる思考トレーニング ~2024年秋田県高校入試数学
https://youtu.be/sZ1WVvyeklA

PDF

・保護されていない通信
3秋田県 <R6年(2024年)全問PDF -9- > 5-Ⅱ-(2)-② だけ
http://homepage1.canvas.ne.jp/ynaka/R6PDF/03akita.pdf#page=10
<過去5年分
http://homepage1.canvas.ne.jp/ynaka/zenmon.html
<数学苦手な中学生,応援します 様内。いつもお世話になっております。
http://homepage1.canvas.ne.jp/ynaka/index.html

sympyのweb上での実行方法

SymPy Live Shellで。FreeCADのマクロは、以下で実行できません。
https://qiita.com/mrrclb48z/items/00dd08b0317069be9342#web%E4%B8%8A%E3%81%AE%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95sympy-live-shell%E3%81%A7
 

sympyで(Youtbeオリジナル 様の方法を参考に)

ver0.1

>いろんな解法があると思うんですけど、
>(面積)比でせめていく。

# ver0.1
from sympy import *
print("#",Rational(5,13)*Rational(3,5)*Rational(8,11)*Rational(7,16))
# 21/286

ver0.2

・ver0.1 と同じ。

# ver0.2
from sympy import *
print("#",Rational(3+2,6+2+3+2)*Rational(3,3+2)*Rational(6+2,6+2+3)*Rational((6+2)**2-(6**2),(6+2)**2))
# 21/286

sympyで(Youtbeコメント 様の方法を参考に)

ver0.3

・作図はページ後半です。
・私も>邪道で乱暴な解き方ですが正解しました。それは直角を含む台形に見立てたこと....
・分母分子それぞれに、1/2*と*hを省略しています。

# ver0.3
from sympy import *
print("#",(Rational(2+3,6+2+3)-Rational(2,6+2)+Rational(3,6+2+3))*2/((6+2)+(2+3)))
# 21/286

WolframAlphaとsympyで(いつもの座標で)

ver0.4

・ダミー?hのまま。Ax,wも数値でなく記号のまま。大人はコレ。

# ver0.4
from sympy import *
var('w,h,Ax',real=true,nonnegative=true)
A,E,D=map(Point,[(Ax,h),(Ax+2*w,h),(Ax+2*w+3*w,h)])
B,G,C=map(Point,[(0 ,0),(   6*w,0),(   6*w+2*w,0)])
H=Line(B,E).intersection(Line(A,G))[0]
I=Line(B,D).intersection(Line(A,G))[0]
F=Line(B,D).intersection(Line(E,C))[0]
print("#",Polygon(E,H,I,F).area/Polygon(A,B,C,D).area)
# 21/286

FreeCADのマクロで作図

・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面に作図しました。
・計算部分は、Ver.0.4 の コピー貼り付けです。
・ダミーの値は、テキトー?です。
・(勉強中)ハッチング表示。

# FreeCADver0.20(旧バージョン)
# 以下でます。 
# この機能は非推奨です。この機能を直接使用しないでください。
#   「make_linear_dimension」または「make_linear_dimension_obj」のいずれかを使用してください。
import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
# # ##############################################
# ver0.4
from sympy import *
var('w,h,Ax',real=true,nonnegative=true)
A,E,D=map(Point,[(Ax,h),(Ax+2*w,h),(Ax+2*w+3*w,h)])
B,G,C=map(Point,[(0 ,0),(   6*w,0),(   6*w+2*w,0)])
H=Line(B,E).intersection(Line(A,G))[0]
I=Line(B,D).intersection(Line(A,G))[0]
F=Line(B,D).intersection(Line(E,C))[0]
print("#",Polygon(E,H,I,F).area/Polygon(A,B,C,D).area)
# 21/286
############################################################################
rep={w:1,h:3,Ax:2}
# rep={w:1,h:3,Ax:6} 
A=A.subs(rep)
B=B.subs(rep)
C=C.subs(rep)
D=D.subs(rep)
E=E.subs(rep)
F=F.subs(rep)
G=G.subs(rep)
H=H.subs(rep)
I=I.subs(rep)
############################################################################
# 3D作図 z=0 XY平面に作図しました。
# 2024-10-08 fontsize 追加しました。従来と互換性がありません。 
# 2024-10-20 HR 
# 2025-03-27 HL
# 2025-10-09 ChatGPT先生より
#    dimension.ViewObject.ShowUnit     = False   # プロパティで単位を表示しないように設定
#    dimension.ViewObject.Decimals     = 0 
############################################################################
def myDimension(fontsize,myExtOvershoot,start_point, end_point,HVP):
    x1, y1 = start_point.args
    x2, y2 = end_point.args
    myFlipText = True
    if HVP=="PL":
       myP1  =Point(float(x1),float(y1))
       myP2  =Point(float(x2),float(y2))
       myFlipText = False
       myExtOvershoot1=abs(myExtOvershoot)
    elif HVP=="PR":
       myP1  =Point(float(x1),float(y1))
       myP2  =Point(float(x2),float(y2))
       myFlipText = False
       myExtOvershoot1=-abs(myExtOvershoot)
    elif HVP=="VL":
       if x1<x2 and y1<y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
       elif x1<x2 and y1>y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
       elif x1>x2 and y1<y2:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
       else:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
    elif HVP=="VR":
       if x1<x2 and y1<y2:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
          myFlipText = False
       elif x1<x2 and y1>y2:
          myP1  =Point(float(x2),float(y1))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
       elif x1>x2 and y1<y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
       else:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x1),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
    elif HVP=="HL":
       if x1 < x2 and y1<y2:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
       elif x1 < x2 and y1>=y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1= abs(myExtOvershoot)
          myFlipText = False
          #myFlipText = True
       elif x1 > x2 and y1<y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1= abs(myExtOvershoot)
       else:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1= abs(myExtOvershoot)
    elif HVP=="HR":
       #if x1<x2 and y1<y2: # 2024-10-20 HR
       if x1<x2 and y1<=y2:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1=-abs(myExtOvershoot)
          myFlipText = False
       elif x1<x2 and y1>y2:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
          myFlipText = False
       elif x1>x2 and y1<y2:
          myP1  =Point(float(x1),float(y2))
          myP2  =Point(float(x2),float(y2))
          myExtOvershoot1=-abs(myExtOvershoot)
       else:
          myP1  =Point(float(x1),float(y1))
          myP2  =Point(float(x2),float(y1))
          myExtOvershoot1=-abs(myExtOvershoot)
    else:  
      print("")
    myM   =myP1.midpoint(myP2)
    myT   =myM+myExtOvershoot1*((myP1-myM).unit).rotate( -pi/2 )
    dimension = Draft.makeDimension(
        FreeCAD.Vector(myP1.x, myP1.y, 0),           # 点1の座標
        FreeCAD.Vector(myP2.x, myP2.y, 0),           # 点2の座標
        FreeCAD.Vector(float(myT.x),float(myT.y),0)  # 矢印の位置を中央に設定
    )
    # Ext Overshootを設定
    dimension.ViewObject.ExtOvershoot = -float(myExtOvershoot)
    dimension.ViewObject.FlipText     = myFlipText

    # 矢印のスタイルを設定
    dimension.ViewObject.ArrowType    = "Arrow"  # 矢印のタイプを "Arrow" に設定
    dimension.ViewObject.ArrowSize    = fontsize/5
    dimension.ViewObject.TextSpacing  = 0
    dimension.ViewObject.LineColor    = (0.0, 1.0, 0.0)  # 緑色
    dimension.ViewObject.FontSize     = fontsize  # フォントサイズを指定
 
    # 2025-10-09 ChatGPT先生より
    dimension.ViewObject.ShowUnit     = False   # プロパティで単位を表示しないように設定
    dimension.ViewObject.Decimals     = 0
    return
def myXYZ2Txt_2D(A):
    return ""
def myXYZ2Txt_XY_2D(A):
    return '(' + str(A.x) + ',' + str(A.y) +  ')'
def myTxtXYZ_2D(fontsize,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 = str(fontsize,)+' mm'
    return
def myTxtXYZ_S_2D(fontsize,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(fontsize,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_2D(xy_tx[2*i-2]) )
    return
def myTxtXYZ_XY_S_2D(fontsize,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_2D(fontsize,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_XY_2D(xy_tx[2*i-2]) )
    return
def myTxtXYZ_MoveY_2D(fontsize,MoveY,A,myWedgei):
    P5x=float(A.x)
    P5y=float(A.y)+MoveY
    P5z=0.0
    p5 = FreeCAD.Vector(P5x, P5y, P5z)
    myText = Draft.makeText(myWedgei, p5)
    myText.Label = myWedgei
    FreeCADGui.ActiveDocument.ActiveObject.FontSize = str(fontsize,)+' mm'
    return
def myTxtXYZ_XY_S_MoveY_2D(fontsize,MoveY,*xy_tx):
    for i in range(1,int(len(xy_tx)/2)+1):
        myTxtXYZ_MoveY_2D(fontsize,MoveY,xy_tx[2*i-2],xy_tx[2*i-1]+myXYZ2Txt_XY_2D(xy_tx[2*i-2]) )
    return
############################################################################
# 3D作図 z=0 XY平面に作図しました。
############################################################################
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
def myLine_H_2D(*args):
    for i in range(1,len(args)):
        myLine_2D(args[0],args[i])
    return
##################################################################################
myLine_C_2D(B,G,C,D,E,A)
myLine_S_2D(A,H,I,G)  
myLine_S_2D(E,F,C)  
myLine_S_2D(B,H,E)  
myLine_S_2D(B,I,F,D)  
myFontsize =0.3
myTxtXYZ_S_2D(myFontsize,A,"A",B,"B",C,"C",D,"D",E,"E",F,"F",G,"G")
myTxtXYZ_S_2D(myFontsize,H,"H",I,"I")
myOvershoot=myFontsize*4
myDimension(myFontsize,myOvershoot,B,G,"HR")
myDimension(myFontsize,myOvershoot,G,C,"HR")
myDimension(myFontsize,myOvershoot,A,E,"HL")
myDimension(myFontsize,myOvershoot,E,D,"HL")
####################################################################################
doc = App.activeDocument()
#
# 2025-03-27 なんだか調子が悪い
# App.ActiveDocument.addObject("App::Origin", "Origin")
# App.ActiveDocumen!t.getObject('Origin').Visibility = True
origin = doc.addObject("App::Origin", "Origin")
# origin.Visibility = True
#
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")

・isometric方向。斜め方向から。
111.png

・上空からです。平面図です。
222.png
・Youtbeコメント 様 # rep={w:1,h:3,Ax:6}
333.png

(途中)私の感想

・数学の教科書を読み直す必要があると思いました。
・授業で、台形の対角線と面積の関係(相似比)の説明を受けて、初見で解く学生さんがおられるカモ。

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

(テンプレート)

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

ver0.1,0.2,0.3

・分数Rational:テキトーなのが見つかりませんでした。
 小数にしないためです。

ver0.4

・intersection(other)
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.LinearEntity.intersection

・property area < Polygons
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Polygon.area

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