-
행렬의 응용 Scale & RotationAlgorithm with C/Math 2020. 10. 7. 19:20
아래의 내용의 연장선이다.
아래의 내용을 먼저 보고 오는 것도 좋은 선택이다.
아래에서 구현한 파일들을 가지고 구현한다.
designatedroom87.tistory.com/133?category=887656
그림으로 Scale 개념 익히기.
기존의 직사각형 A를 우리가 2배 늘리고 싶다고 가정하자.
그러면, 직사각형 4개의 점의 좌표에 각 각 2를 곱할 것이다.
그 2배를 곱한 점을 좌표에다가 찍고, 점을 이으면 직사각형 B가 구해질 것이다.
그러나 위의 방식에는 문제가 있다.
어떤 문제냐 하면,
직사각형은 분명 2배 커졌다. 하지만, B직사각형이 생성된 위치가
직사각형A와 달라졌음을 볼 수 있다.
이것이 문제가 된다.
그렇기 때문에, 크기를 늘리거나 줄일 때 위의 방법을 쓸 수가 없다.
그 해결책은 먼저 직사각형A의 중심점을 원점으로 옮기고 나서
A직사각형의 점의 좌표를 2배씩 늘려주고 나서, 다시 원래의 위치로 옮겨 주면 된다.
아래의 그림을 보자.
Scale을 행렬에 적용하기
앞에서 Scale이나, Rotate는 행렬을 이용한다고 말해왔다.
그러면 여기서, 어떻게 해야 Scale을 구할수 있는지 알아보자.
일단 결론부터 쓰겠다.
위의 내용을 구현한 함수가 아래의 두 함수들이다.
Identity함수는 2by2행렬의 단위 행렬을 리턴하는 함수이다.
위의 방법은 x값과 y값을 동시에 늘리고 싶은 경우에 사용한다.
그러면, 만약에 x값만 늘리고 싶을 때는 어떻게 해야 하는가?
바로,
위의 내용을 구현함 함수가 아래의 두 함수들이다.
이번에는 y값만 늘리고 싶을 때는 어떻게 해야 하는가?
바로,
위의 내용을 구현함 함수가 아래의 두 함수들이다.
이번에는 Rotation에 대해 알아보자.
회전 변환
위의 그림이 말하고자하는 바는 다음과 같다.
점 S가 있다. 점S가 어느 각도로 β만큼 움직였다고 한다.
그 때의 위치가 점이 R이라고 한다.
우리는 R의 위치를 알아낼 수 있다.
선분 OR과 선분 OQ는 서로 길이가 당연히 같다.
그 이유는 원의 반지름이기 때문이다.
증명해보자.
( x2, y2 )는, 현재위치(x,y)에서 각도 β만큼 움직였을 때의 위치이다.
아래의 함수가 바로 이 내용이다.
그리고, 위와 마찬가지로 β만큼 회전했다면 다시 β만큼 되돌아올 수 있다.
이 때는 위 행렬식에서 역행렬을 이용해서 원래의 좌표로 되돌아 올 수 있다.
즉. 다음과 같이 쓸 수 있다.
위의 연산을 이용하면 원래 위치로 되돌아올 수 있다.
위의 내용을 구현한 함수가 아래의 함수이다.
위의 Scale내용과 마찬가지로 반드시 기억해야 할 것은
먼저, 중심점을 원점에 이동시켜서 변환을 해야하는 것이다.
아래의 두 함수는 디버깅 목적으로 만든 함수이다.
이 함수를 만든 목적은 회전 시킨 좌표와 그 이전의 좌표가 각 각 원점에서의 거리가
서로 같아야 하는데 이를 확인하기 위함이다.
아래의 메인 함수이다.
프로그램 실행결과
소스 파일
scale에 대한 내용을 콘솔 창으로만 확인하였는데 이를 API를 활용하여 한 번 보도록 하자.
구현할 내용은 직선 하나를 설정해서 이 직선을 scale 해보자.
먼저 필요한 변수부터 설정하자.
그리고 아래의 함수는 직선을 그리는 함수인데, 함수의 내용은 API에서 제공해주는 함수이다.
아래의 함수는 Q키 혹은 W키가 눌리면 호출되어 직선의 XY scale을 조절하는 함수이다.
아래의 함수는 A키 혹은 S키가 눌리면 호출되어 직선의 X scale을 조절하는 함수이다.
아래의 함수는 Z키 혹은 X키가 눌리면 호출되어 직선의 Y scale을 조절하는 함수이다.
아래는 각 함수들이 호출되는 부분이다.
프로그램 실행결과
소스 파일
아래의 Matrix.cpp, Rotation.cpp, Scale.cpp에는 "pch.h"를 포함시켜야 한다.
그 이유는 잘 모르겠다.
이번에는 위의 회전에 대해 구현해보자.
API는 좌측상단이 원점임을 숙지하자.
위의 Scale내용에서 Draw함수를 제외하고 지운 상태에서 구현하자.
아래의 함수는 A키가 눌리면 45도 회전 하는 함수이다.
아래의 함수는 A키가 눌리면 45도 역회전 하는 함수이다.
아래는 함수를 호출하는 부분이다.
프로그램 실행결과
소스 파일
위의 Scale과 다른 내용은 Winmain함수쪽 말고는 없는데
혹시 모르니 전체 파일을 올리도록 하겠다.
'Algorithm with C > Math' 카테고리의 다른 글
세 점을 입력받아 삼각형의 성립 조건 구하기 (0) 2020.10.14 API를 활용한 파티고라스의 정리를 이용한 거리 구하기 (0) 2020.10.10 행렬의 기본 연산과 행렬식,역행렬, 단위행렬 (0) 2020.10.04 API를 활용한 반사벡터 구현 (0) 2020.10.03 API활용으로 공의 튀어오름을 구현(포물선 운동) (0) 2020.10.03