Рисование сфер на Яве - PullRequest
       9

Рисование сфер на Яве

1 голос
/ 29 декабря 2011

По какой-то причине, когда я пытаюсь создать сферу в 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...
                    }
                }
         }
}

Ответы [ 2 ]

2 голосов
/ 29 декабря 2011

Предполагая, что происхождение вашей сферы (0,0,0), я думаю, что у вас есть дополнительный квадратный корень.

Кроме того, умножение X * X в несколько раз быстрее, чем Math.pow(X,2)

Я бы также переместил вычисление радиуса за пределы цикла и сделал бы его double, как и все остальные, на случай, если ошибки округления могут вас укусить.

(Вы можете заменить приращения X++ на X += foo, чтобы эта версия также работала с меньшими или большими шагами.)

     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 голосов
/ 29 декабря 2011

Более оптимальным решением будет:

 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);
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...