2013-12-11 3 views
1

저는 현재 물리학 및 게임 엔진을 구축하기를 희망하는 기하학 엔진에서 작업하고 있습니다. 문제가 있습니다. 직사각형을 회전 시키면 정사각형이 먼저 다이아몬드 모양으로 변한 다음 거의 보이지 않게되고 다시 정사각형으로 돌아갑니다.회전 사각형으로 인해 늘어납니다.

for(int i = 0; i < fv.length; i++) { 
    double[] ve = fv[i]; 
    ve[0] = ve[0] - getCMX(); 
    ve[1] = ve[1] - getCMY(); 
    double sin = Math.sin(getRot()); 
    double cos = Math.cos(getRot()); 
    ve[0] = ((cos * ve[0]) - (sin * ve[1])); 
    ve[1] = ((-sin * ve[0]) + (cos * ve[1])); 
    ve[0] = ve[0] + getCMX(); 
    ve[1] = ve[1] + getCMY(); 
    fv[i] = ve; 
} 

fv는 2D 이중 배열입니다. getCMX/CMY는 정사각형의 중심을 가져옵니다.

어떤 생각이라도 반가워요, 제 목표는 사각형을 회전시키면서 같은 면적을 유지하는 것입니다 ...?

+1

안녕하세요. 코드에서 오류를 발견하도록 사람들에게 요청하는 것은 특히 생산적이지 않습니다. 디버거를 사용하거나 인쇄 문을 추가하여 프로그램의 진행 상황을 추적하고 발생 예상과 비교하여 문제를 격리해야합니다. 이 둘이 갈라지면 문제를 발견했습니다. (그리고 필요하다면 [최소 테스트 케이스] (http://sscce.org)를 구성해야합니다.) –

+0

네, 이것은 코드 문제보다 수학이 더 낫다고 생각합니다. 기하학을 가르쳐 준 사람으로서, 나는 무엇을 기대해야할지 모르겠다. 그러나 나는 그것이 나를 얻는 것이 정확하지 않다고 가정하고있다. – user2507230

답변

2

두 죄 요인은 반대 기호가 있어야합니다. 그리고 당신은 [0] 업데이트하는 봤어요의 변경되지 않은 복사본을 사용해야했습니다 [1] :

temp = ((cos * ve[0]) - (sin * ve[1])); 
ve[1] = ((sin * ve[0]) + (cos * ve[1])); 
ve[0] = temp; 
+0

죄의 부정은 회전 방향을 역전시킵니다. 그것 없이는 문제가 여전히 지속됩니다. – user2507230

+0

또한 ve [1] 업데이트에 사용할 임시 복사본 [ve]을 저장해야합니다. – PaulQ

+0

좋아, 그 모양을 보존한다면 왜 특정 회전에서 사각형이 선이되거나 ... 완전히 사라지고 사각형으로 다시 확장됩니까? 나는 네가 한 말로 바꾸었고 변화가 없었다. – user2507230

1

두 가지 문제 : 당신은 소스와 동일한 벡터에 결과를 계산할 수 없습니다

  1. . 두 벡터를 사용하십시오.
  2. 오른쪽 변환은 x '= c * x - s * y입니다. y '= s * x + c * y;
관련 문제