0

使用球坐标,我在球体表面周围画了一条弧线。这是我的代码:

    int goose1a_egg1_step = 0; // THIS IS INCREMENTED EACH FRAME
    float goose1a_egg1_theta=7.5; // START THETA
    float goose1a_egg1_phi=4; // START PHI
    float goose1a_egg1_theta_increment = 1.5/goose1a_egg1_divider; // END THETA = 6
    float goose1a_egg1_phi_increment = 3/goose1a_egg1_divider; // END PHI = 1

    float goose1a_egg1_theta_math1 = (goose1a_egg1_theta-(goose1a_egg1_theta_increment* r_goose1a_egg1_step))/10.0*M_PI;
    float goose1a_egg1_phi_math1 = (goose1a_egg1_phi-(goose1a_egg1_phi_increment* r_goose1a_egg1_step))/10.0*2*M_PI;
    r_goose1a_egg1_x = radius_egg_pos * sin(goose1a_egg1_theta_math1) * cos(goose1a_egg1_phi_math1);
    r_goose1a_egg1_y = radius_egg_pos * sin(goose1a_egg1_theta_math1) * sin(goose1a_egg1_phi_math1);
    r_goose1a_egg1_z = radius_egg_pos * cos(goose1a_egg1_theta_math1);  

    glPushMatrix();
    glTranslatef(r_goose1a_egg1_x,r_goose1a_egg1_y,r_goose1a_egg1_z);
    glColor3f (1, 1, .8);
    glutSolidSphere (0.02,5,5);
    glEnd();
    glPopMatrix();

我想画一条额外的弧线,它具有相同的 START 和 END 位置。关键是,与其让第二个弧线遵循与第一个完全相同的轨迹,我可以调整我的数学以使弧线存在可变性吗?例如,第二条弧线的运行路径与第一条弧线略有不同。就像两个航班离开 DFW 前往 JFK,但路线略有不同。

第二个弧的代码如下(注意:两者之间的唯一区别是“goose1a”和“goose1b” - 我不想在这里添加一堆杂乱无章的东西,其中我是随机将随机变量乘以随机整数:/)

    int goose1b_egg1_step = 0; // THIS IS INCREMENTED EACH FRAME
    float goose1b_egg1_theta=7.5; // START THETA
    float goose1b_egg1_phi=4; // START PHI
    float goose1b_egg1_theta_increment = 1.5/goose1b_egg1_divider; // END THETA = 6
    float goose1b_egg1_phi_increment = 3/goose1b_egg1_divider; // END PHI = 1

    float goose1b_egg1_theta_math1 = (goose1b_egg1_theta-(goose1b_egg1_theta_increment* r_goose1b_egg1_step))/10.0*M_PI;
    float goose1b_egg1_phi_math1 = (goose1b_egg1_phi-(goose1b_egg1_phi_increment* r_goose1b_egg1_step))/10.0*2*M_PI;
    r_goose1b_egg1_x = radius_egg_pos * sin(goose1b_egg1_theta_math1) * cos(goose1b_egg1_phi_math1);
    r_goose1b_egg1_y = radius_egg_pos * sin(goose1b_egg1_theta_math1) * sin(goose1b_egg1_phi_math1);
    r_goose1b_egg1_z = radius_egg_pos * cos(goose1b_egg1_theta_math1);  

    glPushMatrix();
    glTranslatef(r_goose1b_egg1_x,r_goose1b_egg1_y,r_goose1b_egg1_z);
    glColor3f (1, 1, .8);
    glutSolidSphere (0.02,5,5);
    glEnd();
    glPopMatrix();

因为我对 3D 数学的理解太差了,我什至不确定是否有办法做到这一点?如果没有,我会为我的设计寻找替代解决方案。但是,如果可以使用球坐标绘制两条使用相同 START 和 END 位置的不同弧线,我们将不胜感激您的建议和指导。

4

1 回答 1

1

您可以尝试在球坐标中计算 B 样条。您将在每个端点放置两个结,并在中间有一个结,您可以左右推动(垂直于最短弧)以调整可变性。

我相信您正在计算从A到的最短弧B,除非这些点完全相反,否则只有一条最短的弧。因此,您需要在球形空间中使用曲线而不是直线。


采用不同的方法,请注意,连接球体表面上两个点的直接路径是球体与通过这两个点的平面之间的交点。如果您可以围绕这两个点之间形成的轴旋转该平面,则相交将为您提供替代弧。

诀窍是计算它们。阅读平面 - 球体相交。这个公式应该是一个椭圆形的部分,所以它可能不会太糟糕。那么你不需要球坐标。

于 2013-01-30T21:30:39.750 回答