외부 타원의 다각형 그리기

14407 단어 Python수학.mathtech
다음은 외접 타원의 다각형을 그리는 방법을 소개한다.
"이렇게 열광적인 일을, 너는 무엇을 하고 싶니?"이런 소리를 들었지만 어떤 사건에서 실제로 필요했다.
고등학교 수학이 실제 업무에서 살아남는 장면이 있는데 이런 가벼운 느낌으로 읽어주셨으면 좋겠습니다.

전제 지식


외접 타원의 다각형을 쓰는 전제 지식으로 다음과 같은 두 가지가 필요하다.
  • 원외접 다각형의 좌표
  • 타원과 진원의 관계
  • 전제지식1: 원외접 다각형의 좌표


    원의 반지름r을 설정하고 원의 외접 다각형 교점의 각도θ를 설정하면 진짜 원의 중심에서 진짜 원의 외접 다각형 교점까지의 거리r/cos(θ/2)가 됩니다.
    따라서 외접 다각형의 좌표는 (x, y) = (r/cos(θ/2)*cos(α), r/cos(θ/2)*sin(α))이다.α는 외접 다각형의 각이다)

    전제지식2: 타원과 실원의 관계


    중심을 원점으로 하는 반경 a의 진원과 반장직경 a, 반단직경 b의 타원을 고려한다.
    이 두 도형은 다음과 같은 관계가 있다.
    真円の座標(x, y)=楕円の座標(x, (b/a)y)
    
    즉, 반경 a의 진원을 y방향으로 배가하면 반장직경 a, 반단직경 b의 타원을 형성할 수 있다.

    (결론) 그리기 방법


    다음 절차에 따라 반장직경 a, 반단직경 b의 타원을 그릴 수 있다.
  • 반경 a의 원을 생성하는 외접 다각형(전제지식1)
  • 생성된 외접 다각형의 각 정점의 y 좌표를 배가(b/a)(전제지식2)
  • Matplotlib 그리기


    Matplotlib을 사용하여 실제로 그리는 경우는 다음과 같습니다.

    비교하기 위해 타원 외접 다각형을 포함한 총 4개의 도형을 그렸다.
  • 트루시클(TrueCircle)
  • 외접 진원의 다각형(OutTrueCircle)
  • 길이가 진원 반경과 같은 타원(Ellipse)
  • 외접 타원의 다각형(OutEllipse)
  • 외부 연결 타원의 다각형을 그리는 것을 볼 수 있습니다.
    참고로 원본 코드는 이런 느낌입니다.
    # numpyをインポート
    import math
    import matplotlib.pyplot as plt
    import pylab
    inRadius = 5.0
    radius_a = 5.0
    radius_b = 3.0
    
    #
    # 真円の描画
    #
    def draw_circle():
        # 中心(0.2,0.2)で半径0.2の円を描画
        list = plt.Circle((0.0, 0.0), inRadius, fc="#f0f0f0", label = "TrueCircle")
        plt.gca().add_patch(list)
        plt.axis('scaled')
    
    #
    # 真円外接多角形の描画
    #
    def draw_out_circle():
        outSeg = 10
        deg = math.radians(360 / outSeg)
        angle = 0
        x = []
        y = []
        outRadius = inRadius / math.cos(deg / 2)
        for i in range(outSeg + 1):
            angle += deg
            x.append(outRadius*math.cos(angle))
            y.append(outRadius*math.sin(angle))
    
        plt.plot(x, y, label = "OutTrueCircle")
    
    #
    # 楕円の描画
    #
    def draw_ellipse():
        outSeg = 360
        deg = math.radians(360 / outSeg)
        angle = 0
        x = []
        y = []
        outRadius = radius_a / math.cos(deg / 2)
        for i in range(outSeg + 1):
            angle += deg
            x.append(outRadius*math.cos(angle))
            y.append(outRadius*math.sin(angle) * (radius_b / radius_a))
    
        plt.plot(x, y, label = "Ellipse")
    
    #
    # 楕円外接多角形の描画
    #
    def draw_out_ellipse():
        outSeg = 10
        deg = math.radians(360 / outSeg)
        angle = 0
        x = []
        y = []
        outRadius = radius_a / math.cos(deg / 2)
        for i in range(outSeg + 1):
            angle += deg
            x.append(outRadius*math.cos(angle))
            y.append(outRadius*math.sin(angle) * (radius_b / radius_a))
    
        plt.plot(x, y, label = "OutEllipse")
    
    
    if __name__ == '__main__':
        draw_circle()
        draw_out_circle()
        draw_ellipse()
        draw_out_ellipse()
        plt.legend()  # 凡例を表示
        pylab.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
        pylab.subplots_adjust(right=0.7)
        plt.title("Graph Title")
        plt.xlabel("X-axis")
        plt.ylabel("Y-axis")
        plt.show()
    
    이상.재미있다고 생각하는 사람이'괜찮다'는 것을 얻으면 즐겁다.

    좋은 웹페이지 즐겨찾기