0
0

扇形の中の長方形の面積「高校入試チャレンジ問題 長方形ABCDの面積は?」をsympyとFreeCADでやってみたい。

Last updated at Posted at 2024-07-10

2024-07-11 こっそり直しました。

・Ver.0.3 長さと幅の積
・wikipediaより長方形の面積
・「sympyで(オリジナル 様の方法を参考に)」の私の計算間違い。
 S = 80 → S = -80 + 40*sqrt(19)

2024-07-10

扇形の作図を、あきらめました。
寸法線表示も、あきらめました。 ???線分OB,BPがselectできない。
・問題文は2次元ですが、3次元FreeCADのマクロで、XY平面上に作図しました。

オリジナル

・YUUU0123 様 (0:00〜7:21)

>それでは

sympyで(普通に)

・ver0.1 点Bから右回りで。点B→A→D→C。 長方形の面積。縦x横を使っていません。

Ver.0.1

perpendicular_line(p)
https://docs.sympy.org/latest/modules/geometry/lines.html#sympy.geometry.line.LinearEntity.perpendicular_line
property area
https://docs.sympy.org/latest/modules/geometry/polygons.html#sympy.geometry.polygon.Polygon.area

# ver0.1 ver0.1 点Bから右回りで。点B→A→D→C。長方形の面積。縦x横を使っていません。
from sympy import *
r =20
O,P,Q,B=map(Point,[ (0,0),(0,r),(r,0),(0,r*Rational(1,2))] )
BA=Line  (B,Q).perpendicular_line(B)
A =Circle(O,r).intersection(BA)[0]        # ???多分[0]。順番をよくわかっていません。
AD=Line  (A,B).perpendicular_line(A)
D =Circle(O,r).intersection(AD)[1]        # ???多分[1]。順番をよくわかっていません。
DC=Line  (A,D).perpendicular_line(D)
C =Line  (DC) .intersection(Line(B,Q))[0] # ???多分[0]。順番をよくわかっていません。
print("#",      Polygon(A,B,C,D).area)
print("#",float(Polygon(A,B,C,D).area))
# CADが使えれば、速攻?です。
# -80 + 40*sqrt(19)
# 94.35595774162694

Ver.0.2 少し上品?に書けば。

・ (省略)もしかしたら、やる気を出せば1行でできるかも。

# ver0.2 チョット上品に。
from sympy import *
r =20
O,P,Q,B=map(Point,[ (0,0),(0,r),(r,0),(0,r*Rational(1,2))] )
A =Circle(O,r).intersection(Line  (B,Q).perpendicular_line(B))[0]        # ???多分[0]。順番をよくわかっていません。
D =Circle(O,r).intersection(Line  (A,B).perpendicular_line(A))[1]        # ???多分[1]。順番をよくわかっていません。
C =Line  (A,D).perpendicular_line(D)   .intersection(Line(B,Q))[0] # ???多分[0]。順番をよくわかっていません。
print("#",      Polygon(A,B,C,D).area)
print("#",float(Polygon(A,B,C,D).area))
# -80 + 40*sqrt(19)
# 94.35595774162694

Ver.0.3 長さと幅の積(wikipediaより)

# ver0.3  長さと幅の積(wikipediaより)
from sympy import *
r =20
O,P,Q,B=map(Point,[ (0,0),(0,r),(r,0),(0,r*Rational(1,2))] )
A =Circle(O,r).intersection(Line  (B,Q).perpendicular_line(B))[0]        # ???多分[0]。順番をよくわかっていません。
D =Circle(O,r).intersection(Line  (A,B).perpendicular_line(A))[1]        # ???多分[1]。順番をよくわかっていません。
C =Line  (A,D).perpendicular_line(D)   .intersection(Line(B,Q))[0] # ???多分[0]。順番をよくわかっていません。
print("#",      (A.distance(B)*B.distance(C)).simplify())
print("#",float((A.distance(B)*B.distance(C)).simplify()))
# -80 + 40*sqrt(19)
# 94.35595774162694

FreeCADのマクロで作図

扇形の作図を、あきらめました。
寸法線表示も、あきらめました。 ???線分OB,BPがselectできない。
・計算部分は、Ver.0.2 の コピー貼り付けです。

import FreeCAD
import Part
import DraftTools
import Draft
import Mesh
############################################################################
# ver0.2 チョット上品に。
from sympy import *
r =20
O,P,Q,B=map(Point,[ (0,0),(0,r),(r,0),(0,r*Rational(1,2))] )
A =Circle(O,r).intersection(Line  (B,Q).perpendicular_line(B))[0]        # ???多分[0]。順番をよくわかっていません。
D =Circle(O,r).intersection(Line  (A,B).perpendicular_line(A))[1]        # ???多分[1]。順番をよくわかっていません。
C =Line  (A,D).perpendicular_line(D)   .intersection(Line(B,Q))[0] # ???多分[0]。順番をよくわかっていません。
print("#",      Polygon(A,B,C,D).area)
print("#",float(Polygon(A,B,C,D).area))
# -80 + 40*sqrt(19)
# 94.35595774162694
############################################################################
# 作図用
############################################################################
# 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 = '2.0 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
#######################################################################################
myCircle_2D(Circle( Point( 0,0),r))
myLine_S_2D  (O,P)
myLine_S_2D  (O,Q)
myLine_C_2D  (B,A,D,C)
myLine_S_2D  (C,Q)
myTxtXYZ_S_2D(O,"O",A,"A",B,"B",C,"C",D,"D")
myTxtXYZ_S_2D(P,"P",Q,"Q")
####################################################################################
doc = App.activeDocument()
App.ActiveDocument.addObject("App::Origin", "Origin")
# App.ActiveDocumen!t.getObject('Origin').Visibility = True
App.ActiveDocument.recompute()
Gui.activeDocument().activeView().viewAxonometric()
Gui.SendMsgToActiveView("ViewFit")

isometric方向?です。

0.png

拡大図

1.png

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

・作図はあきらめました。

# CADが使えれば、速攻?です。無理数は無理でした。
# 以下はプログラムではないので、チェックがたいへん。
# 間違ってれば、ごめんなさい。
from sympy import *
var('BF,degOBQ',real=True,poitive=True)
r =20
# BOQ∽BFO 
# 1:2:√5
trBOQ=Triangle(asa=(degOBQ,10,90))
trBFO=Triangle(asa=(degOBQ,BF,90))
BF=10/sqrt(5)         ;print("# BF=",BF)
AE=BF                 ;print("# AE=",AE)
AD=AE*2               ;print("# AD=",AD)
FO=BF*2               ;print("# FO=",FO)
EO=sqrt(r**2-AE**2)   ;print("# EO=",EO)
DC=EO-FO              ;print("# DC=",DC)
S =(AD*DC).simplify() ;print("# S =",S )
print("# それでは")
# BF= 2*sqrt(5)
# AE= 2*sqrt(5)
# AD= 4*sqrt(5)
# FO= 4*sqrt(5)
# EO= 2*sqrt(95)
# DC= -4*sqrt(5) + 2*sqrt(95)
# S = -80 + 40*sqrt(19)
# それでは

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

(テンプレート)

・以下ができたら、助かります。指定と全部です

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

>4つの内角はすべて等しい。(すなわち直角である。)
>長方形の2組の向かい合う辺のうち、長い(か等しい)方の長さを長方形の長さ、短い(か等しい)方の長さを長方形の幅と呼ぶ。
>長方形の面積 𝐴 は長さ𝑥 と幅 𝑦の積によって求められる。

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