-2

円のアルゴリズムを使用して、大きな円の横に小さな円を描くにはどうすればよいですか?各円は9または8ポイントで構成され、各4ポイントをリンクして収集し、これを4つの下にリンクします
........... ................................................................................... ...................................................

4

2 に答える 2

2

1 つのループで内側と外側のポイントを生成する必要があります。

これを試してみてください:

2D トーラス

#include <GL/glut.h>
#include <cmath>

void Torus2d( float inner, float outer, unsigned int pts )
{
    glBegin( GL_QUAD_STRIP );
    for( unsigned int i = 0; i <= pts; ++i )
    {
        float angle = ( i / (float)pts ) * 3.14159f * 2.0f;
        glVertex2f( inner * cos( angle ), inner * sin( angle ) );
        glVertex2f( outer * cos( angle ), outer * sin( angle ) );
    }
    glEnd();
}

void display()
{
    glClear( GL_COLOR_BUFFER_BIT );

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );
    double ar = w / h;
    glOrtho( -4 * ar, 4 * ar, -4, 4, -1, 1);

    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();

    glColor3ub( 255, 0, 0 );
    Torus2d( 2, 3, 20 );

    glutSwapBuffers();
}

int main( int argc, char **argv )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
    glutInitWindowSize( 640, 480 );
    glutCreateWindow( "GLUT" );
    glutDisplayFunc( display );
    glutMainLoop();
    return 0;
}
于 2013-11-01T18:12:37.037 に答える
1

Sieglord の Abode 記事に触発された、Go でのより高速な (三角関数が少ない) ソリューション (c++ に簡単に変換できます) を以下に示します。

func Torus(cx, cy, inner, outer float64, num_segments int) {
    theta := 2 * math.Pi / float64(num_segments)
    c := math.Cos(theta) //precalculate the sine and cosine
    s := math.Sin(theta)
    t_in := 0.0
    t_out := 0.0
    x_in := inner  //we start at angle = 0
    x_out := outer //we start at angle = 0
    y_in := 0.0
    y_out := 0.0

    gl.Begin(gl.QUAD_STRIP)
    for ii := 0; ii <= num_segments; ii++ {
        gl.Vertex2f(float32(x_in+cx), float32(y_in+cy))   //output vertex inner
        gl.Vertex2f(float32(x_out+cx), float32(y_out+cy)) //output vertex outer
        //apply the rotation matrix
        t_in = x_in
        t_out = x_out

        x_in = c*x_in - s*y_in
        x_out = c*x_out - s*y_out

        y_in = s*t_in + c*y_in
        y_out = s*t_out + c*y_out
    }
    gl.End()
}
于 2014-02-14T21:07:59.143 に答える