글목록

2022년 3월 12일

PowerPoint 매크로 - 그림, 도형 정렬/배열하기 (4) - 이산 좌표로 변환

위치에 따라 상하 순서와 좌우 순서를 찾고 나면, 사용자가 정의한 배열에 맞게 그림을 그룹화합니다. 예를 들어 아래와 같이 6개의 그림이 배열되었을 때, 상하 및 좌우 순서를 각각 1~6번으로 번호를 매깁니다. 가로 방향으로 3열, 세로 방향으로 2행으로 배열하겠다고 하면, 상하 순서로 위의 3개는 1행(Y=1), 아래 3개는 2행(Y=2)으로 지정해줍니다.

다시 Y=1에 해당하는 도형을 좌우 순서에 따라 X=1, 2, 3으로 정해주고, Y=2에 해당하는 도형에 대해서도 똑같이 지정해주면, 모든 도형은 (X,Y) 좌표로 (1,1), (2,1), (3,1) / (1,2), (2,2), (3,2)의 좌표를 갖게 됩니다.

이제, 이산화된 좌표를 이용하여 원하는 위치에 배열을 해주면 원래의 그림 배열에서 순서가 흐트러지지 않으면서도 격자 위치에 배치됩니다.


위에서 행 좌표(Y 좌표)을 먼저 지정해주고, 다음에 열 좌표(X 좌표)를 지정해주었습니다. 만약, 열 좌표를 먼저 지정한 후 행 좌표를 지정해준다면, 경우에 따라 최종 좌표가 달라질 수 있습니다. 특히 무작위로 배열된 경우일수록 차이가 많이 날 수 있습니다. 다만, 행 좌표를 먼저 지정하도록 한 이유는.. 순전히 개인적인 편의성 때문입니다.

여러개의 도형이나 사진을 넣고 배열할 때, 원하는 결과를 얻기 위해서는 무작위로 나열된 상태에서 배열 매크로를 실행하는 것이 아니라, 도형들을 대략적으로 배열해둔 상태에서 매크로를 실행하게 됩니다. 따라서, 그림을 수작업으로 대략적인 배열을 하게 되는데, 이때 첫 행에 한 그룹, 두번째 행에 두번째 그룹.. 이렇게 배열을 하는 경우가 많기 때문입니다.

사용자에 따라 왼쪽 끝열에 첫번째 그룹, 두번째 열에 두번재 그룹... 이렇게 배열해두고 매크로를 실행하는 것이 편하신 분들은 그룹화 및 좌표화하는 순서를 바꾸시면 됩니다.


이상과 같은 목적으로 2차원 연속 좌표를 2차원 이산 좌표로 변경하기 위해 아래와 같이 그룹화하는 함수를 작성하였습니다.

'-----------------------------------------------
Function RankToGroup(iRank(), iGroupMember As Long) As Variant()
  '위치 순서가 기입된 배열을 입력하고, 그룹 갯수를 입력하면, 1번부터 그룹화하여 좌표를 출력합니다. 예를 들어, 상하 순서(Y좌표)가 1~6까지 기입되어 있는 배열을 2개 그룹으로 바꿔주려면, 1~3까지는 1을 출력하고, 4~6까지는 2로 바꿔서 출력합니다.
  Dim tGroup(), i As Long
  ReDim tGroup(LBound(iRank) To UBound(iRank))
  For i = LBound(iRank) To UBound(iRank)
    tGroup(i) = Int((iRank(i) - 1) / iGroupMember) + 1
  Next
  RankToGroup = tGroup
  Erase tGroup
End Function
'-----------------------------------------------
Function RankToSubGroup(iRank(), iGroup(), iSubGroupNum As Long) As Variant()
  '위의 함수에서 상하 순서(Y좌표)를 그룹화한 정보와 좌우 순서(X좌표)를 입력한 후 1개 행에 포함할 갯수를 입력하면 좌우 순서에 따라 1,2,3... 번으로 좌표를 다시 생성합니다. 
  Dim i As Long, j As Long, n As Long, tSubGroup(), tIndex(), tRank()
  ReDim tSubGroup(LBound(iRank) To UBound(iRank))
  For i = 1 To 
iSubGroupNum
    n = -1
    ReDim tIndex(0)
    ReDim tRank(0)
    For j = LBound(iRank) To UBound(iRank)
      If iGroup(j) = i Then
        n = n + 1
        ReDim Preserve tIndex(n)
        tIndex(n) = j
        ReDim Preserve tRank(n)
        tRank(n) = iRank(j)
      End If
    Next
    If n >= 0 Then
      tRank = GetRank(tRank, True)
      For j = 0 To UBound(tIndex)
        tSubGroup(tIndex(j)) = tRank(j)
      Next
    End If
  Next
  RankToSubGroup = tSubGroup
  Erase tSubGroup, tIndex, tRank
End Function


댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :