너무 오랫만에 적는 로보코드 관련 글입니다. 이제 로보제출일이 4일밖에 남지 않은 상태에서 글을 쓰고 있습니다. 어차피 로보코드 대회는 매년 계속 될 거라는 굳은 믿음 때문에 누군가에게 도움이 될 거라는 생각으로 글을 쓰겠습니다.

 기존 로보코드 글은 너무 말도 안되는 실험과 이론을 중심으로 글을 써 온 것 같군요... 이번 글은 매우 쉽게 이해할 수 있는 글인데 수학적으로 접근할려고 합니다. 로보위키사이트에서도 찾을 수 있고, IBM developerworks 에서도 쉽게 볼 수 있는 글이긴 한데 수학적으로 접근해 볼려고 합니다.  왜 이래야 하는지 이론적으로 설명할려고 합니다.

 우선 로보코드 좌표( http://nahanmil.egloos.com/67438  에서 맨 처음 그림)을 봐주시기 바랍니다. 좌표계를 눈여겨 보기 바랍니다. 우리가 수학에서 사용하는 좌표와 다르다는 것을 알 수 있습니다.  기존의 수학에서 극좌표(polar coordinates , 반지름과 각도로 좌표를 표현하는 방법)를 직각좌표로 변환할 때 다음과 같습니다. 
x = r cos (θ)           θ : 는 그리스 문자 theta 를 표시 한 것 입니다.
y = r sin (θ)
입니다.
 그런데 로보코드에서는 x,y 좌표의 위치와 각도의 위치가 기존의 수학에서와 다릅니다. 얼굴의 90도 왼쪽으로 꺽은 상태에서 보아도 각도의 시작방향이 반대이고, x, y 좌표에서도 0도 가  위치한 축이 y축 입니다. 그래서 기존의 수학에서와 달리 다음과 같이 표현됩니다.

y = r cos ( 90 - θ  )  =  r cos( θ - 90 ) =  r sin (θ)
x = r sin ( 90 -  θ  )  =  r cos( -θ ) = r cos (θ)

 라고 표현됩니다. 고등학교 때 수학의 정석 책으로 공부했다면 얼싸안고(All, sin, tan , cos) 라는 공식을 외운 적이 있다면 이 공식이 적용되는 원리를 아실거라 믿습니다. (모르겠다면 그냥 저 결과식면 기억해 두세요..)

 여기 까지가 기본적인 수학적 배경지식입니다. 이제 부터 API를 통해 계속 봅시다.

로보코드 각에 대한 그림( http://nahanmil.egloos.com/67438   에서 두 번째 그림)을 봐주시기 바랍니다. 
로보코드에서는 상대방 로봇의 위치를 바로 알려주는 API를 제공하지 않습니다. 스스로 구현해야 합니다. 적에 대한 정보는 레이더에 적이 발견 될 때마다 void onScannedRobot(ScannedRobotEvent event) 라는 함수를 통해 얻을 수 있습니다. ScannedRobotEvent 라는 인수에서는 적의 에너지 정보, 로봇 정면의 위치, 속도 그리고 이글에서 필요한 적과 나와의 거리 정보 ( getDistance() ) 내 head와 상대방의 위취에 대한 상대적인 각도( getBearing() ) 정보를 알려 줍니다. getBearing() 에 대한 설명이 조금 어려운 것 같은데 로보코드 각에 대한 그림을 보고 이해 하시기 바랍니다. ( 처음 말했다시피 수학적 분석이 이글의 핵심이므로 그 핵심은 설명했기 때문에 제 임무는 끝났것 같다는 변명을 하고 싶군요.. )  

 ScannedRobotEven 에서 제공하는  적의 위치에 관한 자료는 어디까지나 내 좌표를 기준이므로 내 좌표를 더해야 한다. 따라서 결론적으로 다음과 같은 코드가 나온다. 


void onScannedRobot(ScannedRobotEvent e)
{
    double bearing = getHeading() + e.getBearing() ;
    double enemyX = getX() + e.getDistance() * 
                   Math.sin( Math.toRadians( bearing ) )
    double enemyY = getY() + e.getDistance() * 
                  Math.cos( Math.toRadians( bearing ) )

}

물론 import java.lang.Math; 을 맨 처음에 해주어야 한다. Math.toRadian 이라는 함수는 "도"라는 각의 단위를 라디안으로 고치는 함수이다.  예전버전에서는 이 방법을 사용했지만 새로운 버전에서는 AdvancedRobot 을 상속받아 사용할 때

void onScannedRobot(ScannedRobotEvent e)
{
    double bearing = getHeadingRadians()  + e.getHeadingRadians() ;
    double enemyX = getX() + e.getDistance() * 
                   Math.sin( bearing )
    double enemyY = getY() + e.getDistance() * 
                  Math.cos( (bearing )

}
를 이용해서 만들수도 있다.
제가 쓴 로보코드 글을 볼 사람이 있을까 쉽지만, 누군가를 볼거라 생각하고 요즘 버전에 맞게 수정중입니다. 버전 1.2.6A를 기준으로 다시 적어갈려고 합니다. (며칠 전 또 로보코드 새버전이 나왔지만 IBM에서 대회는 이 버전을 기준으로 하므로 여기에 맞츨려고 합니다. ) 

 제가 쓴 글인데 이해 안 되는 글도 있고 그러는데, 그 것을 손대기 어려울 것 같고.. 어째든 로보코드를 만들어 가면서 필요한 부분이 많기에 고쳐가면서 공부할려고 합니다.

 글 밑에 있는 최종 수정일을 참고하시기 바랍니다.

이제 정말 대회가 얼마 안 남았내요...
[로보코드] 로보코드를 아세요. (http://nahanmil.egloos.com/41903 )(정말 오래전에 쓴 글이군요.)

  제 블로그에 많이 방문하셨다면 태그라는 칸에 로보코드라고 쓰여있는 글귀를 한 번쯤 보셨을 것 같습니다. 군대가기 전에 제가 관심을 가지고 있었고, 대회에도 참여한 적이 있습니다.  어찌된 것인지 사람들의 관심에서 멀어진 것 중 하나입니다.

 작년까지도 대회가 열린 것으로 봐선 올해 여름에도 한국 IBM 에서 대회를 열 것이라고 믿습니다.

 공식사이트는 소트포지에 있는 http://robocode.sourceforge.net/ 이 사이트 입니다. 다운 받을려고 하니 February 18, 2007 라는 날짜로 새롭게 나와있습니다. 그래픽이 조금 산뜻해 진 것 같습니다.


 
 다른 변화는 아직 잘 모르겠습니다.

 어째든 새로워진 만큼, 다시 사람들로 부터 사랑을 받았으면 좋겠습니다.