http://cafe.naver.com/onell0/28604 의 과제 때문에 만들었습니다. ㅎㅎ 삼각함수를 쓰지 않고, 오직 대수학만으로 풀었습니다. 파란 팔의 길이를 a, 초록 팔의 길이를 b, 로봇 팔 끝점의 x좌표를 c, y좌표를 d라 하고, 구해야 하는 로봇 팔의 관절의 x좌표를 x, y좌표를 y라고 한다면, 피타고라스의 정리에 의해 x²+y²=a² (c-x)²+(d-y)²=b² 가 성립하고, 두 번째 식을 전개한 뒤 위 식과 연립해서 정리하면 cx+dy=(a²-b²+c²+d²)÷2가 됩니다. 여기서 '귀찮은 상수'인 우변을 f로 치환해 주고, x=(f-dy)÷c, y=(f-cx)÷d를 각각 첫 번째 식 x²+y²=a²에 대입하면 x와 y에 대한 이차방정식이 나옵니다. 이제 그것을 근의 공식에 대입해서 식을 조금 정리하면 됩니다(또는 한쪽만 계산한 후, c와 d를 바꿔 주기만 하면 상대편의 공식이 나온다는 점을 이용할 수도 있습니다). 저는 식을 편리하게 바꾸기 위해, 원점과 로봇 팔의 끝점 간의 거리를 나타내는 e를 도입해서 e²=c²+d²라는 관계식으로 피곤한 c²+d²들을 정리했습니다. 결과적으로 나온 공식은 다음과 같습니다. x=(cf±d√(a²e²-f²))÷(e²) y=(df±c√(a²e²-f²))÷(e²) (1÷e²를 분자에 각각 곱해서 정리하면 a÷e와 b÷e를 다른 문자로 치환하고 f÷(e²)도 치환해서 조금 더 간단한 식으로 만들 수 있습니다만, 제가 식을 정리한 목적은 공식의 간결성도 있지만 중복 계산을 최대한 줄이기 위함이었고 a÷e, b÷e 같은 것까지 다 변수에 넣기엔 좀 그래서 그냥 이 정도에서 마쳤습니다. 사실 공식을 더 개량하기가 귀찮기도 했지만요ㅎㅎ;) 실험 결과로는, x, y 공식의 ±에서, 양쪽 다 +나 -를 고를 경우에는 제대로 안 그려지고, x는 +, y는 -를 골라야 제대로 그려집니다.(만약 x는 -, y는 +로 한다면 제대로 그려지긴 하지만 초록 팔이 파란 팔에서 시계 방향으로 돌아간 형태로 나타납니다. 즉 거울상이 되는 것이죠.) 어쨌든 그래서 이 경우에는 x는 +, y는 -를 선택했습니다. ㅎㅎ 만약 로봇 팔의 끝점의 위치가 로봇 팔이 닿을 수 없는 곳이라면, 그냥 렌더링하지 않게 해 놓았습니다. 즉 로봇 팔이 갑자기 사라졌다면 그건 로봇 팔을 그릴 수 없는 위치이기 때문이며 절대 버그가 아닙니다. ㅎㅎ(이차방정식을 풀어 x, y를 결정했기 때문에, 위 공식에서 제곱근이 등장하게 되는데, 이 안에 음수가 들어갈 경우 이런 사태가 발생합니다.)
wandookong입니다. ㅎㅎ 과제 내 주신 분: @kimseojin 님(스크래치 매니아 프로그래머들 카페의 '썩쏘'님)