C++ 破解一行隐秘的密码:三角学和平面定义 非常感谢。

C++ 破解一行隐秘的密码:三角学和平面定义 非常感谢。,c++,geometry,trigonometry,plane,C++,Geometry,Trigonometry,Plane,-3票赞成一个主题正确的问题(从什么时候开始编程和几何不属于StackOverflow?) 这一点并不十分清楚,但如果人们不立即否决它,它本可以得到加强,而这一点现在对这个问题的任何未来都是一种威慑 这里的人们有一种讨厌的倾向,他们宁愿投下一票,也不愿伸出援手。宽容和开放的思想到此为止 我将留下这张图片作为证据,证明我试图消除模糊的程序是一个有价值的软件,可能会引起很多人的兴趣。如果有一天它被公之于众,那肯定不是因为一群愚蠢的下层选民 原来的问题 我试图破译程序中一个模糊的部分,我想把它移植到

-3票赞成一个主题正确的问题(从什么时候开始编程和几何不属于StackOverflow?)

这一点并不十分清楚,但如果人们不立即否决它,它本可以得到加强,而这一点现在对这个问题的任何未来都是一种威慑

这里的人们有一种讨厌的倾向,他们宁愿投下一票,也不愿伸出援手。宽容和开放的思想到此为止

我将留下这张图片作为证据,证明我试图消除模糊的程序是一个有价值的软件,可能会引起很多人的兴趣。如果有一天它被公之于众,那肯定不是因为一群愚蠢的下层选民

原来的问题 我试图破译程序中一个模糊的部分,我想把它移植到可读性更好的形式

这段代码附带的唯一文档告诉我,我们正在从两个“方向余弦”和到原点的距离生成空间中的随机平面。 我花了一整天的时间试图破解这个程序,我也取得了一些进展,但我被困在一条特定的线路上,至今仍无法理解

具体的线似乎是关于:从两个角度生成法向量的a,b,c分量(这也是平面方程中的a,b,c),一个我理解为Z轴和法线之间的角度,另一个是X轴和法线之间的角度

所有变量都有模糊的名称,当我理解了它们的含义后,我将其中一些变量重命名为更明确的名称。编写此代码的人不再在这里给出任何解释

随后使用的唯一输出是三个法线分量normal_a、normal_b和normal_c

在第一部分中,代码生成平面的随机参数

void Plane::generate(int i) // the index of this plane
                              // as a sequence of planes is being generated here
{
    t_pt = (i + 10)*rnd_float() / 2; // this looks a lot like the distance
                                     //                         from the origin

    t_ap = rnd_float() * PI * 2; // rnd_float() returns a rand float between 0 and 1

    t_at = rnd_float() * PI * 2;
    t_it = (.5 - rnd_float())*PI*.025*COEFF_TRANS; // COEFF_TRANS = 1.5

    t_aa = rnd_float() * PI * 2;
    t_ia = (.5 - rnd_float())*PI*.0025*.5*COEFF_TRANS;
然后确定向量法线的坐标

    t_at = t_at + t_it; // this is most probably the angle from Z axis to normal
    float ptt = t_pt + cos(t_at)*.01*t_pt * t_pt; // <<<<<< the obscure line

    normal_c = 1 / (sqrt(1 + ptt*ptt)); // length of normal Z component = c
    normal_ab = sqrt(1 - normal_c*normal_c); // length of normal XY component = ab

    t_aa = t_aa + t_ia * .31; // this is the other angle, from X or Y axis to normal
    float pa = t_ap + cos(t_aa)*.05; // a bit obscure here also

    normal_a = normal_ab*cos(pa);
    normal_b = normal_ab*sin(pa);
}
我真的很难理解这个ptt变量能代表什么。 如果我必须自己计算法线,我想它只涉及一个余弦和一个角

如果我们将代码翻译成我所理解的代码,它看起来是这样的,但它不能帮助我猜测
ptt
代表什么:

    float ptt = planeDistance + cos(angleZToNormal)*.01*planeDistance*planeDistance;
我假设下一行,在这里计算法线的z长度,可能依赖于公式:cos(angle)=A/(sqrt(A²+O²)),A是相邻边的长度,O是对边的长度。但这只是猜测


如果有人能给我提供任何能让我走上正轨的建议或线索,我将不胜感激。谢谢

我仍然无法真正告诉您这是在做什么,但我想分享我的进展,至少:

float rnd_float() {return rand() / (RAND_MAX + 1.0f);}

void generate(int i) // the index of this plane
                     // as a sequence of planes is being generated here
{
    // generate a random angle B and offset it a bit, randomly
    float angle_B = rnd_float() * 2.0f * PI,        // angle from 0 to 2 pi
        offset_B = (0.5f - rnd_float()) * PI        // angle from -pi to pi,
            * (.025f * COEFF_TRANS);                // times some scaling factor

    angle_B += offset_B;                            // offset the angle B


    // generate a random angle C and offset it a bit, randomly
    float angle_C = rnd_float() * 2.0f * PI,        // angle from 0 to 2 pi
        offset_C = (0.5f - rnd_float()) * PI        // angle from -pi to pi,
            * (.0025f * .5f * COEFF_TRANS) * .31f;  // times two scaling factors

    angle_C += offset_C;                            // offset the angle D


    // some sort of distance?
    float dist = (i + 10) * rnd_float() / 2;
    // generate a random angle A from 0 to 2 pi
    float angle_A = rnd_float() * 2.0f * PI;

    // no idea
    float ptt =    dist + cos(angle_B) * dist * dist * 0.01f;
    // ditto
    float pa  = angle_A + cos(angle_C) * .05f;


    // still not sure what they're doing here, but rearraged it a bit
    float normal_c  =        1 / sqrt(1 + ptt * ptt), // length of normal Z?
          normal_ab = abs(ptt) / sqrt(1 + ptt * ptt); // length of normal XY?

    float normal_a = normal_ab * cos(pa);
          normal_b = normal_ab * sin(pa);
}
注意

t_pt -> dist
t_ap -> angle_A
t_at -> angle_B
t_aa -> angle_C
其他值得注意的是,生成的a、b和c值确实构成了一个适当的标准化单位向量,并针对不同的
i
多次运行代码,得出以下结果:


您应该从中学习的是,始终合理地命名变量,或者至少在声明中对它们所代表的内容写一条评论。我完全同意。写这篇文章的人来自另一个时代,实际上是我的祖父。我正在努力使他的作品更具可读性和可理解性,达到更好的标准。对下层选民:你建议我做什么?我正试图得到社区的帮助来解决一个我已经坚持了两天的问题,这个问题的解决可能会给其他人带来巨大的价值(分享这个项目).这个问题似乎离题了,因为它可能是关于trigonometry@N0vember我建议,如果您确切地知道函数需要返回什么,只需完整地重写它(忽略它是如何运行的)。一些旧代码只是不可恢复的。@ JuangopANZA如果它是C++标签的问题,我可以删除它。但我相信,如果人们认为某个问题不属于正确的类别,就可以使用编辑功能来更改它,而不是进行向下投票。问题仍然是关于编程,而不是纯粹的三角函数。谢谢你的尝试。看到落选票,我不太敢打赌有三角函数经验的人会来这里给我们任何线索。我将继续调查我自己。@n0v请记住,没问题,我不确定您是否可以在不知道或不认识问题域的情况下讲述更多内容。如果你知道法向量/平面应该遵循的分布,那可能会非常有用。我唯一要随附的文本(用我的母语,非常简短)就是说,如果平面角对应于“π的整分数”,它会改进结果。再精确不过了。我的问题是,我甚至不明白这条线如何产生一个有效的法向坐标。这就是让我完全陷入困境的原因。不能理解使我发疯。角度是复杂的,但至少我知道它们是随机的,有一定的顺序。
t_pt -> dist
t_ap -> angle_A
t_at -> angle_B
t_aa -> angle_C