2011-12-29 3 views
1

어떤 이유로 점의 반경을 확인하여 자바로 구를 만들려고 할 때 구 대신 큐브를 제공합니다. 내 코드 또는 제 수식에 문제가 있습니까?Sphere Drawing in Java

for(double X = 0; X < diameter; X++) 
     { 
      //mcspace.logger.info("X = " + Double.toString(X)); 
      for(double Y = 0; Y < diameter; Y++) 
      { 
       //mcspace.logger.info("Y = " + Double.toString(Y)); 
       for(double Z = 0; Z < diameter; Z++) 
       { 
        //mcspace.logger.info("Z = " + Double.toString(Z)); 
        int radius = diameter/2; 

        double cX = X; 
        double cZ = Z; 
        double cY = Y; 

        if (X > radius){cX -= radius;} 
        if (Y > radius){cY -= radius;} 
        if (Z > radius){cZ -= radius;} 

        double Cr = Math.sqrt(Math.sqrt(Math.pow(cX,2) + Math.pow(cY,2)) + Math.pow(cZ,2)); 

        if(Cr <= radius) 
        { 
         SetInShere(X,Y,Z); 
         // This is just a function that is in my code but the problem is that almost all the points are in the sphere, I almost always get a cube instead of a sphere... 
        } 
       } 
     } 
} 
+0

I 돈 그 질문을 이해하지 못한다. "반점의 반경"이란 무엇입니까? 또한 실제로 컴파일되고 실행되는 최소한의 예제를 제공하십시오. 그것 없이는, 당신의 코드가 무엇을 해야하는지를 이해하는 것은 매우 어렵습니다. – sleske

+0

이동 int 반지름 = 직경/2; 효율성을 위해서 당신의 루프 밖에서. 및 do double Cr = Math.hypot (Math.hypot (cX, cY), cZ); 이 방법은 간단하고 오류가 발생하기 쉽지 않으며 (내 수학 학위가 완전히 낭비되지 않는 한) 작동해야합니다. 편집 : @BRPocock의 아이디어가 더 좋습니다. –

답변

2

구체의 원점이 (0,0,0)이라고 가정 할 때 거기에 여분의 제곱근이 있다고 생각합니다.

또한, X의 *의 X 곱하면

또한 단지의 경우 반올림 오류가 올 것, 루프의 외부 반경 계산을 이동하고 나머지처럼에게 double을 만들 것 ... Math.pow(X,2)보다 몇 배 빠른 너를 물으려면.

(당신은뿐만 아니라, 작거나 큰 단계를이 버전의 작품을 만들기 위해 X += fooX++ 단위를 대체 할 수있다.)

 double radius = diameter/2; 

    for(double X = -radius; X < radius; X++) 
     for(double Y = -radius; Y < radius; Y++) 
      for(double Z = -radius; Z < radius; Z++) 
       if(Math.sqrt((X * X) + (Y * Y) + (Z * Z)) <= radius) 
        SetInShere(X,Y,Z); 
0

더 많은 최적의 솔루션이 될 것입니다 :

int r2=radius*radius; 
for(int X = -radius; X <= radius; X++){ 
    int x2=X*X; 
    for(int Y = -radius; Y <= radius; Y++){ 
     int y2=Y*Y; 
     for(int Z = -radius; Z <= radius; Z++) 
      if(x2 + y2 + (Z * Z) <= r2) 
       SetInShere(X,Y,Z); 
    } 
}