위와 같은 자유형 도형 ABCD가 있을 때 

C점과 D점을 대칭되도록 만들고 싶습니다.

 

물론 처음부터 사다리꼴 도형으로 그리면 하나의 조절점으로 두 점이 동시에 조절되므로 자동으로 대칭이 됩니다.

 

여기서는 그밖의 자유형 도형인 경우에 두 점을 대칭되도록 만드는 것에 집중하겠습니다.

대칭이 되도록 만드는 것은 네모 도형을 하나 더 추가하고 기존 사다리꼴과 도형병합(교차 혹은 조각)를 실행해서

공통된 부분만 남기고 이 도형을 복제해서 좌우를 반사시키고 좌우에 대칭되는 절반짜리 도형을 도형병합(통합)하는 방법이 있습니다.

 

 

단, C와 D가 평행인 경우에는 가능합니다. 하지만 Y값이 서로 다르다면 문제가 다릅니다.

아래처럼 작업하면 사다리꼴이 아닌 각이 5개인 도형이 남게 됩니다.

 

이렇게 원하지 않는 결과가 나오므로 사다리꼴 사각형을 처음부터 다시 그리는 것이 낫습니다.

 

 

여기서 다른 방법으로 VBA를 이용해서 사각형의 좌표를 직접 수정하는 방법을 도전해보겠습니다.

 

도형의 점은 Node 라는 개체이고

Nodes(1).Points(1,1) 은 1번째 시작 점의 X좌표, 

Nodes(1).Points(1,2) 는 1번째 시작점의 Y좌표를 가리킵니다.

 

노드의 좌표값은 읽기전용이라 노드의 좌표를 수정하려면

Nodes(1).Points(1,1) = 123.456 이런 식으로는 효과가 없고

'도형.Nodes.SetPosition 노드위치(1~5), x좌표, y좌표' 의 형식으로 명령을 실행해야합니다.

사각형이어도 노드 개수는 5개인데 시작 노드와 마지막 노드가 일치해야 닫힌 도형이 됩니다. 

 

3번노드(점C)를 4번 노드(점D)를 기준으로 대칭되게 하려면 아래와 같습니다.

Sub AdjustNode3()

    Dim shp As Shape
    Dim x As Single, y As Single
    
    Set shp = ActiveWindow.Selection.ShapeRange(1)
    
    '3번째 노드의 x값을 4번째 노드와 반사되게,
    '3번째 노드의 y값을 4번째 노드의 y값과 일치
    x = shp.Nodes(2).Points(1, 1) - (shp.Nodes(4).Points(1, 1) - shp.Nodes(1).Points(1, 1))
    y = shp.Nodes(4).Points(1, 2)
    shp.Nodes.SetPosition 3, x, y

End Sub

 

 

여기서 shp.Nodes(4).Points(1, 2) 이런 식의 표현이 너무 길기 때문에 좀 줄여보겠습니다.

Function N(oShp As Shape, i As Integer, xy As Integer) As Single
    
    N = oShp.Nodes(i).Points(1, xy)
    
End Function

이제 N(shp, 4, 2) 이렇게 간단히 표현할 수 있습니다.

 

3번 노드를 대칭하거나 4번 노드를 대칭하고 싶을 수 있어서 

약간 더 범용적으로 AdjustNode 함수를 만들어봅니다.

 

Sub Test3()
    
    ' 3번 노드를 4번 노드와 대칭되게
    AdjustNode toN:=3, fromN:=4
    
End Sub
Sub Test4()
    
    ' 4번 노드를 3번 노드와 대칭되게
    AdjustNode 4, 3
    
End Sub
Function AdjustNode(toN As Integer, fromN As Integer)

    Dim shp As Shape
    Dim x As Single, y As Single
    
    Set shp = ActiveWindow.Selection.ShapeRange(1)
    
    If toN = shp.Nodes.Count - 1 Then
        x = N(shp, 1, 1) + (N(shp, 2, 1) - N(shp, toN - 1, 1))
    ElseIf toN = shp.Nodes.Count - 2 Then
        x = N(shp, toN - 1, 1) - (N(shp, toN + 1, 1) - N(shp, 1, 1))
    End If
    y = shp.Nodes(fromN).Points(1, 2)
    
    shp.Nodes.SetPosition toN, x, y

End Function

Function N(oShp As Shape, i As Integer, xy As Integer) As Single
    
    N = oShp.Nodes(i).Points(1, xy)
    
End Function

 

각이 더 많은 다각형인 경우 무리가 있고 4각형인 경우

마지막 노드와 바로 전 노드를 대칭시킨다는 가정입니다.

test3 은 3번 노드를 4번 노드 기준으로 대칭시키고

test4는 4번 노드를 3번 노드 기준으로 대칭시킵니다.

 

 

 

 

샘플 파일

DrawShapeAdj1.pptm
0.05MB