这是一张图片:http://i.imgur.com/MRvz24u.gif
所以我可以说出问题是什么,我的epsilon(或任何用于球面坐标的符号)正在重复。所以我计算积分的方法是:
double theta = acos(p.getY()/p.magnitude());
theta = theta/3.1415926;
double epsilon = atan(p.getZ()/p.getX());
epsilon = epsilon + 3.1415926/2;
epsilon = epsilon /3.1415926;
我很确定其余的不是问题,但我会把它放在这里以防万一
int w = texture ->columns();
int h = texture ->rows();
double x = w * epsilon ; x = (int) x;
double y = h * theta; y = (int) y;
int row = y;
int column = x;
Magick::PixelPacket *pixels = texture->getPixels(0, 0, w, h);
Magick::Color color = pixels[w * row + column];
double range = pow(2, texture -> modulusDepth());
double r = color.redQuantum()/range ;
double g = color.greenQuantum()/range ;
double b = color.blueQuantum()/range ;
return Color(r, g, b, 0);
我不确定为什么我会得到重复值,因为我的范围最初应该是 -pi/2
使用 atan2
而不是 atan
。 atan
接受 x/y,而atan2
接受 x,y 。
这允许atan2
处理 x 和 y 均为负数的情况与正数的情况不同。 atan
无从得知。