원점이 center_X, center_Y
터치점 touch_X, touch_Y
일떄 원점과 터치지점를 연결했다고했을떄
화면에서 보는 입장에서이제 그 각도를 구하는거죠
원점이 중심점인샘이라서
float dx = center_X - touch_X;
float dy = center_Y - touch_Y;
radian = (float) Math.atan2(dx, dy);
이렇게 하고
pointX = (float) ((Math.sin(radian) * pRadius) + posX);
pointY = (float) ((Math.cos(radian) * pRadius) + posY);
이렇게 하면 된다는데.....
pointX, pRadius, posX는 어떤 값인지.. 설명도 안되있고
이 방법이 맞나요?
다른 좋은 방법이 있나요?
위의 식은 맞는거고 아래쪽식은 Y가 틀려보입니다.
"Y좌표는 아래로 갈수록 증가한다, X좌표는 오른쪽으로 갈수록 증가한다."
우리가 스크린에서 사용하는 좌표계의 특징입니다.
"12시 방향의 각이 0이다"
이건 아래쪽 식을 보고 대충 추정한겁니다.
아래식을 좀 설명드리겠습니다. 위의식은 뻔한거고...
일반 수학에서는
1.Y좌표가 위로 갈수록 증가하고,
2. 3시방향이 0이며,
3. 각이 증가하는 방향이 반시계방향입니다.
여기서 1번과 3번은 아주 밀접한 관계가 있는 것이므로 하나로 보면...
(좌표계 방향때문에 회전하는 방향이 자연스럽게 바뀐다고 보면됩니다. 각이 +가 되는 방향이 시계냐 반시계냐 결정될수 있다는거죠.)
결국 3시방향이 0이냐 아니면 12시방향이 0이냐가 남습니다. 아마도 님께서는 이전에 올린것을 봐서 12방향을 0으로 잡으니까
보정을 해야겠죠? 스크린에서는 각이 시계방향으로 증가하는 시스템을 사용하므로, 3시방향 기준으로 12시 방향은 -90도 입니다.
원래 수학식인 pointX = (float) ((Math.cos(radian) * pRadius) + posX); (sin아닙니다. cos입니다. 원래 수학식...)에서
radian에 Math.toRadian(-90)을 더하면 cos이 sin으로 바뀝니다. 물론 바뀌면서 -90도는 사라지죠.
원래 수학식 pointY = (float) ((Math.sin(radian) * pRadius) + posY); 에서
radian에 Math.toRadian(-90)을 더하면 sin이 -cos으로 바뀝니다.
y가 왜 +cos인지 이해가 잘 안갑니다.
pointX는 역산으로 구하는 x좌표입니다. 위의 식에서 touch_x죠
pRadius는 좌표간의 거리입니다.sqrt( x편차 제곱+y편차 제곱 )
posX는 중심좌표...
각도가.. 대각선 방향으로 올려도 값이 증가하네여...
각도가 아니라 길인가..
뭔가 식이 이상한듯여...
float dx = center_X - touch_X;
float dy = center_Y - touch_Y;
radian = (float) Math.atan2(dx, dy);
이건데..
y, x로 바꿔야 겠네요... atan2가 y, x로 되어있으니...
축이 바뀐다고 해서 기본개념이 크게 바뀌는건 아닌데...
대각선으로 해도 값이 증가하는건 대각선으로 똑바로 선을 긋는게 아니라서 그럴지도 모릅니다.
터치로 원점을 지나는 일직선을 똑바로 긋는게 거의 불가능에 가깝죠...
atan2( x, y )로 하면 12시 방향을 0으로 하는 각을 구할때 편할지도 모르겠군요...
어차피 atan2는 두 영역으로 나눠서 계산 할 수 밖에 없고 쪼개는 방향이 (y, x)보단 (x, y)가 편하네요...
아이거 도대체 왜 이래...
int total_W = getWindowManager().getDefaultDisplay().getWidth();
int total_H = getWindowManager().getDefaultDisplay().getHeight();
int center_X = total_W/2;
int center_Y = total_H/2;
int touch_X;
int touch_Y;
float dx,dy;
float radian;
double dgree;
//선언
touch_X = (int) event.getRawX();
touch_Y = (int) event.getRawX();
dx = center_X - touch_X;
dy = center_Y - touch_Y;
radian = (float)Math.atan2(dx, dy);
dgree = (double) (radian * (360/3.14));
//계산
Log.e("dgre", ""+(int)dgree);
//로그
뭐...가 이상한거죠
실험으로 딱 부분 좌표 잡고 로그했더니 94
손으로 그 지점 누른거는 64인가 할튼 되게 이상하고
대각선으로 가도
숫자 오차범위도 심하고 이거 식이 이상한게 아닐까요? ㅠㅠㅡ
degree구하실때 Math.toDegree라는 메소드로 쉽게 구할 수 있구요. 되도록이면 이걸쓰세요
파이가 3.14로 끝이 아닌건 아시죠? 그리고 180/PI일겁니다. 왜냐면 360도 = 2PI 이니까요.
touch_X = (int) event.getRawX();
touch_Y = (int) event.getRawX();
dx = center_X - touch_X;
dy = center_Y - touch_Y;
//dx = center_X - 114;
//dy = center_Y - 284;
radian = (float) Math.atan2(dx, dy);
dgree = (double) (radian * (180 / 3.141592653589793238462643383279));
//dgree = Math.toDegrees(radian);
// Log.e("dgre", ""+(int)dgree);
Log.e("dgre", "" + (int) dgree);
이게
왼쪽으로 가면 숫자가 줄어들고, 오른쪽으로 갈면 늘고
즉 x죠
그리고
y는 말이죠... 완전 장애인;
위 아래 내려가도 값이 변동이 없음,...
원점이면 몰라도.... 원점도 아닌데 위;아래 가면 당연히
각도가 나와야하는데..
정확히 누를순없으니
오차가 있다해도 5정도 밖에 안되고..
y가 바뀌면 각도도 바껴야하는데 이게 무슨.. 완전 장애..
대각선은 정확하지 않아서 모르겠고... 퓨ㅠㅠㅠㅠㅠ




float dx = center_X - touch_X;
float dy = center_Y - touch_Y;
radian = (float) Math.atan2(dx, dy);
각도는 여기까지 입니다.