2014-12-10 3 views
3

나는 거의 대각선 원의 좌표를 얻는다.대각선 원의 좌표는 어떻게 얻습니까?

여기까지 제가 지금까지 있습니다.

// Center point 
double centerX; 
double centerY; 
double centerZ; 
for (double degree = 0D; degree < 360D; degree = degree + 8D) { 
    double angle = degree * Math.PI/180D; 
    // Difference from the center 
    double x = 1.5D * Math.cos(angle); 
    double y; 
    if (degree >= 0D && degree < 90D) { 
     y = degree/90D; 
    } else if (degree >= 90D && degree < 180D) { 
     y = 1D - ((degree - 90D)/90D); 
    } else if (degree >= 180D && degree < 270D) { 
     y = -1D * ((degree - 180D)/90D); 
    } else { 
     y = -1D * (1D - ((degree - 270D)/90D)); 
    } 
    double z = 1.5D * Math.sin(angle); 
    // New point 
    double pointX = centerX + x; 
    double pointY = centerY + y; 
    double pointZ = centerZ + z; 
} 

다음은 게임의 출력입니다. 가장자리가 생기고 비효율적이기 때문에 완벽하지 않습니다.

내가 그것을 어떻게 해결합니까? 더 좋은 방법이 있나요?

답변

2

이것은 당신이 이미 가지고있는 비슷해야하지만, 간단하고 부드러운입니다 :

double y = 1.0D * Math.sin(angle); 

지금, 이러한 치수, 결과는 꽤 원하지만 신장 된 타원이 아니다. 원을 원한다면 코사인과 사인의 계수가 Pythagorean Theorem을 따르는 지 확인하십시오. 예를 들면 다음과 같습니다.

double x = 1.5D * Math.cos(angle); 
double y = 0.9D * Math.sin(angle); 
double z = 1.2D * Math.sin(angle); 
이러한 계수는 x^빗변을 나타내는 계수는 다른 두 삼각 함수와 다른 삼각 함수를 사용하는 좌표에 연결해야합니다.

다음과 같은 경우에 cos = 2 + sin^2 = 1 인 경우이 값이 참임을 확인할 수 있습니다. 가장 유지하기 쉬운 코드라면, (x, y, z) = (cos, sin, 0)을 할당 한 다음 회전 행렬 또는 일련의 회전 행렬을 벡터 (x, y, z)에 적용하는 것이 좋습니다.). 나중에 회전 양을 미세하게 조정하려면 읽기 쉽고 엉망이되기가 더 쉬울 것입니다.