왼쪽과 같이 삽입- 도형에서 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은 삼각형으로 만들어서 병합하다보니 도형간의 틈이 발생합니다.
(댓글 주신 JeJe님 감사합니다.)
틈이 발생하지 않도록 사각형으로 만들어서 도형병합하는 버전입니다.
지식인 링크:
https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020103&docId=375719470
'PPT+VBA' 카테고리의 다른 글
ppt 스톱워치 - 타이머 누적 기록 (3) | 2021.04.22 |
---|---|
현재 슬라이드를 윈도우 바탕화면으로 설정 (0) | 2021.03.23 |
MS파워포인트 버전별 차이점 정리 (0) | 2021.01.26 |
PPT 소책자(Booklet) 인쇄 (0) | 2021.01.09 |
PPT 홀수, 짝수페이지 따로 출력하기 (수동 양면 출력) (1) | 2020.12.02 |
파워포인트 슬라이드 고해상도(고화질)로 저장 (0) | 2020.11.27 |
룰렛 회전판 생성기 v2 (6) | 2020.10.16 |
회전 룰렛(회전판) 모음 및 자동 생성기 (12) | 2020.10.14 |
최근댓글