왜 그럴거 같나요..?
11758번 - CCW
왜 그럴거 같나요..?
보시면 일단. 평행 이동 시켰어요. 어짜피 이 과정은 정수니까 기준점을 원점으로 이동시키는 연산은.
오차에 영향을 미치지 않습니다.
그런데, 그 다음에 점 p0과 p1의 각도를 구했단 말이죠. 일단 여기서.
y축 변화량/sqrt(x변화량^2 + y변화량^2) = val 이라고 하면 asin(val) 값을 구합니다.
문제는 sqrt과정에서도 오차가 생기는데, sin(u) = 실값 + 오차이기 때문에
실제 실값이 1이나 -1에 가까워 질수록 u의 오차값은 커집니다. 실제 답과 말이지요.
오차가 커진 상태로 회전 변환을 했다. 회전 변환 같은 경우. 세타 값에 sin값과 cost 값을 적절히 넣은 값을 곱하고 더하고 할 건데..
여기서 오차가 안 날까요..? 원점으로부터 거리가 엄청나게 커질수록 오차는 늘어날 수밖에 없는 구조에요.
그러니까 더 정확히 말하면
sqrt를 구하고
asin값을 구하고
또 다시 그 값을 sin과 cos에 넣은 다음에
뭔가를 곱하고 더하는 과정에서 오차가 계속 누적이 되었기 때문에 잘못된 값을 출력하는 겁니다.
댓글을 작성하려면 로그인해야 합니다.
legendmic2 5년 전
입력받은 세 숫자를 x[0],y[0],x[1],y[1],x[2],y[2] 로 저장했구요
세 점이 이루는 삼각형을 S라고 했을때
정점 (x[0],y[0])이 원점으로 가도록 S를 평행이동시키는 과정이 50~58줄입니다
원점에서 정점(x[1], y[1])을 이은 선분을 p라고 했을때
선분p와 x축 사이의 각도를 구하는 함수가 AnkGenFunc구요
그렇게 구해진 각도를 ank에 저장한 후 (-ank)만큼 점을 회전이동하는 함수가 RotFunc입니다
(선분p를 x축 위로 회전이동시키기 위해 ank만큼 반시계방향으로 회전시키기 위해서입니다.)
그러면 원래의 삼각형S는 한 변이 x축에 위치한 새로운 삼각형 S'이 되는데요,
이때 x축 위에 있지 않은 꼭지점 (x[2], y[2])가 양의 y축 방향에 위치하면 반시계방향이므로 1을 출력,
음의 y축 방향에 위치하면 시계방향이므로 -1을 출력,
y값이 0이라면 삼각형이 아닌 일직선인 상태였으므로 0을 출력합니다.
디버깅해본결과 AnkGenFunc의 경우엔 예제 셋 모두 제대로 나오는데
이 경우에 RotFunc를 2번 수행하고 나면
보시는바와 같이 y[1], y[2]이 제대로 바뀌지 않습니다.
어느 부분을 빠트린것일지 여쭙고싶습니다. 끝까지 읽어주셔서 감사합니다!