본문 바로가기
개발/android

점의 선대칭 이동 공식을 코드로 짜보자

by 매몰 2014. 8. 15.

고1때 누구나 배우게 되는 직선의 대한 대칭이동!


이것이 내생에 정말로 활용될지는 몰랐다ㅎㅎ


앱을 만드는 개발자가 되면서 느끼는 것은 깊게는 아니더라도 이런 공식같은것이 있구나 하는정도만 알아나도 앱을 만드는데 무척이나 도움이 된다는 것이다..

다시말해 깊게 공부할 필요가 없다ㅎㅎ 어차피 필요하게 되면 알아서 다시 공부한다ㅎㅎ


직선의 대한 대칭이동중 여기서는 점의 선대칭 이동을 코드로 변환해 보겠다.

즉, 목적은 xy좌표점을 하나의 직선을 기준으로 선대칭이 되는 또하나의 xy좌표점을 찾는것이다.


먼저 선대칭 점을 찾는 공식은 이곳을 참고바란다.


http://mathbang.net/465


http://www.mathfactory.net/node/367





여기서 이용할 내용은 대충 이렇다


선대칭 이동



1. 이동전 (x1,y1)과 이동후 (x2,y2)을 잇는 선분의 중점은 직선 y = ax + b의 한점이다.

    

    중점 공식: M((x1 + x2) / 2, (y1 + y2) / 2)


2. 선분 (x1,y1),(x2,y2)와 y = ax + b의 기울기는 수직이다.


    수직 공식: 두 선의 기울기의 곱 = -1





이를 코드로 옮겨 보겠다.


1. 두점의 중점 공식을 이용하면 x = (x1 + x2) / 2, y = (y1 + y2) / 2 이고

    이를 직선 y = ax + b 에 대입하면 ((y1 + y2) / 2) = a(x1 + x2) + b 이다

    그리고 우리가 구할 점은 x2 와 y2 이므로


    x2 = (1 / a)(y1 + y2) - (2 / a)b - x1

    y2 = a(x1 + x2) + 2b - y1


2. 수직 공식을 이용하면 ((x2 - x1) / (y2 / y1))a = -1 이고

    이것을 위의 식에 대입하기 위해서 고치면


    y2 = -(1 / a)x2 + (1 / a)x1 + y1

    x2 = -ay2 + ay1 + x1


끝으로 위의 식들을 대입하여 코드화 하면 이렇다.


float axa = a * a;

float n = 1 / (axa + 1);

float m = 1 - axa;

float x2 = n * ((m * x1) + (2 * a * y1) - (2 * a * b));

float y2 = n * ((2 * a * x1) - (m * y1) + (2 * b));






이 코드는 실제로 게임 "라인스네이크"에서 사용되고 있다.

뱀이 선을 맞고 튕겨나갈때 이 선대칭 코드가 이용되었다. 확인해 보기 바란다.


https://play.google.com/store/apps/details?id=com.go4android.linesnake21lite


http://tsto.re/0000670093 





 

 



수제 앱 장인: 고영진


1인 개발자 

  

     실패만 하고 있어도 꿈을 포기하지 않는 남자 

     제가 직접 경험하고 습득한 지식을 위주로 올릴게요

 





사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기