球面坐标映射创建双epsilons

时间:2017-01-10 18:30:28

标签: c++ graphics imagemagick

这是一张图片: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< epsilon< pi / 2然后我转移它然后缩放它。

1 个答案:

答案 0 :(得分:1)

使用atan2代替atanatan接受x / y而atan2接受x,y。

这允许atan2处理x和y均为负值的情况,与他们正面的情况不同。 atan无法知道。