정9각형

 

왼쪽과 같이 삽입- 도형에서 5각형이나 6,7,8각형은 있지만 9각형, 11각형은 없습니다.

그럴 경우 임의의 개수의 각을 가진 정다각형( Regular Polygon)을 그리는 방법입니다.

손으로 그린다면 9각형의 경우 40도각을 가진 이등변 삼각형(Isosceles Triangle)을 그리고 가상의 큰 원과 그룹지어서 이 그룹도형을 복제해서 40도식 회전해서 9개를 합치면 됩니다. 40도 각은 선을 그리고 회전을 20도 시키는 방법 등으로 각도를 맞출 수 있습니다.

이 과정을 VBA로 처리해서 원하는 각개수를 가진 정다각형을 만들어보려고 합니다.

먼저 아래 그림을 봅시다.

 

1. 위 그림대로 이등변삼각형을 그려서 각 개수만큼 복사해서 회전시켜준 다음 마지막에 모든 삼각형을 합쳐주도록 하겠습니다.

2. 첫번째 12시 방향의 이등변삼각형을 그릴 때 Left, Top 좌표를 구하기 위해 이등변 삼각형을 반으로 쪼개서 9각형이라면 왼쪽 삼각형의 [Tangent 20도 값 = 왼쪽 삼각형의 짧은 변의 길이(r2) / 큰원의 반지름(r1)] 이 됩니다.

3. 왼쪽 삼각형의 짧은 변의 길이를 구해서 12시방향 첫번째 삼각형의 Left, Top 좌표 값을 지정하고 넓이(r2*2)와 높이값(r1)을 추가해서 삼각형을 그려줍니다. 이등변 삼각형은 뒤집어져서 그려지기 때문에 다시 180도 회전시켜줍니다. 삼각형 대신 사각형을 그려도 되긴 합니다.

4. 각도 개수만큼 삼각형을 회전시킬 때 그냥 회전시키면 제자리에서 돌기 때문에 큰원의 중심을 축으로 돌도록 가상의 큰원과 그룹으로 만든 후에 회전시킵니다.

5. 가상의 원들은 지워주고 남은 삼각형도형들을 Merge 해주면 되겠습니다.(2010 이후버전에서 가능)

아래는 코드입니다. 더 자세한 내용은 코드를 참고 바랍니다.

 

 

코드내용:

더보기
'도형병합으로 정다각형 만들기
Option Explicit

Sub AbraCadabra()
    Dim i As Integer
    For i = 4 To 50 Step 1
    
        With ActivePresentation
        
            .Slides.Add(.Slides.Count + 1, ppLayoutBlank).Select
            drawRegularPolygon i
            
        End With
        
    Next i
End Sub

Function drawRegularPolygon(iMax As Integer)
    
    Dim Pres As Presentation
    Dim Sld As Slide
    Dim Shp0 As Shape, Shp1 As Shape, Shp2 As Shape
    Dim l!, t!, w!, h!, rb!, rs!, SH!, SW!, angle!
    'Dim iMax As Integer
    Dim i As Integer
    Dim arrShp() As String
    
    Const PI = 3.14159265358979
    Const Margin As Single = 50
    Const Stroke As Single = 0    '도형병합시 틈이 생기는 것을 방지
    
    Set Pres = ActivePresentation
    Set Sld = ActiveWindow.Selection.SlideRange(1)
    
    'iMax = 9   '// 9각형 그리기
    angle = 360 / iMax
    ReDim arrShp(iMax)
    With Pres.PageSetup: SH = .SlideHeight: SW = .SlideWidth: End With
    rb = SH / 2 - Margin '큰 원의 반지름
    
    '배경 큰 원(회전축)
    l = SW / 2 - rb
    t = Margin
    w = rb * 2
    Set Shp0 = Sld.Shapes.AddShape(msoShapeOval, l, t, w, w)
    Shp0.Name = "shpOval"
    'Shp0.Fill.ForeColor.RGB = rgbOrange
    Shp0.Line.Visible = msoFalse
    Shp0.Fill.Transparency = 1
    
    '12시방향 사각형으로 시작
    rs = Tan((angle / 2) * (PI / 180)) * rb '이등변 삼각형의 밑변의 절반
    l = SW / 2 - rs - Stroke
    t = SH / 2 - rb - Stroke
    w = rs * 2 + Stroke * 2
    h = rb + Stroke * 2
    'Set Shp1 = Sld.Shapes.AddShape(msoShapeIsoscelesTriangle, l, t, w, h)
    '이등변삼각형 병합시 도형간 틈이 생기는 것 방지하기위해 사각형으로 생성
    'JeJe님 감사합니다.
    Set Shp1 = Sld.Shapes.AddShape(msoShapeRectangle, l, t, w, h)
    Shp1.Rotation = 180
    Shp1.Name = "shpRectangle0"
    arrShp(0) = Shp1.Name
    Shp1.Fill.ForeColor.RGB = rgbSteelBlue
    Shp1.Line.Visible = msoFalse
    'Shp1.Line.Weight = 1
    'Shp1.Line.ForeColor.RGB = rgbSteelBlue
    'Shp1.Line.Visible = msoFalse
    'Shp1.Line.ForeColor.RGB = rgbGray
 
    Sld.Shapes.Range(Array("shpOval", "shpRectangle0")).Group.Name = "shpSet0"
    
    '12시그룹도형을 복사 후 회전
    For i = 1 To iMax - 1
        
        With Sld.Shapes("shpSet0")
            l = .Left
            t = .Top
            With .Duplicate
                .Left = l
                .Top = t
                .Rotation = 360 / iMax * (i)
                .Name = "shpSet" & i
                .GroupItems("shpOval").Delete
                Sld.Shapes(Sld.Shapes.Count).Name = "shpRectangle" & i
                arrShp(i) = "shpRectangle" & i
            End With
        End With
        
    Next i
    Sld.Shapes("shpSet0").GroupItems("shpOval").Delete
    Sld.Shapes.Range(arrShp).MergeShapes (msoMergeUnion)
    With Sld.Shapes(Sld.Shapes.Count)
        .Name = "RegularPolygon" & iMax
        .Rotation = 0
        .LockAspectRatio = msoTrue
    End With
    
End Function

 

위 코드를 실행하면 슬라이드를 계속 추가하면서 4각형부터 50각형까지 그려줍니다.

각이 100개 넘게 많아질수록 원에 가까워집니다.

 

나머지는 첨부파일 참고하세요.

 

다각형만들기1.pptm
0.31MB

다각형만들기1은 삼각형으로 만들어서 병합하다보니 도형간의 틈이 발생합니다.

(댓글 주신 JeJe님 감사합니다.)

틈이 발생하지 않도록 사각형으로 만들어서 도형병합하는 버전입니다.

 

다각형만들기2사각형.pptm
0.19MB

지식인 링크:

https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020103&docId=375719470