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의 경우엔 예제 셋 모두 제대로 나오는데

1 1
3 3
5 5

이 경우에 RotFunc를 2번 수행하고 나면


이름형식
x0x00e1fc0c {0.00000000000000000, 2.8284271247461898, 5.6568542494923797}double[3]



이름형식
y0x00e1fbec {0.00000000000000000, 2.2204460492503131e-16, 4.4408920985006262e-16}double[3]

보시는바와 같이 y[1], y[2]이 제대로 바뀌지 않습니다.

어느 부분을 빠트린것일지 여쭙고싶습니다. 끝까지 읽어주셔서 감사합니다!

chogahui05   5년 전

왜 그럴거 같나요..?

chogahui05   5년 전

보시면 일단. 평행 이동 시켰어요. 어짜피 이 과정은 정수니까 기준점을 원점으로 이동시키는 연산은.

오차에 영향을 미치지 않습니다.

그런데, 그 다음에 점 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년 전

@chogahui05

감사합니다... 어릴때 배우던 수학공식으로 풀어보려했는데 오차의 스노우볼이 문제였네요...

언제나 좋은 답변 감사합니다!

댓글을 작성하려면 로그인해야 합니다.