[OpenGL]课后案例14:Mandelbrot集程序

//A.14  Mandelbrot集程序
#include<stdio.h>
#include<stdlib.h>
#include<gl/glut.h>
/* default data */
#define CENTERX -0.5
#define CENTERY  0.5
#define HEIGHT   0.5
#define WIDTH    0.5
#define MAX_ITER 100
/* N * M array to be generated */
#define N 500
#define M 500
float height=HEIGHT;
float width = WIDTH;
float cx = CENTERX;
float cy = CENTERY;
int max = MAX_ITER;
int n=N;
int m=M;
/* use unsigned bytes for image */
GLubyte image[N][M];
/* complex data type and complex add,mult,and magnitude functions
probably not worth overloaded */
typedef float complex[2];
void add(complex a,complex b,complex p)
{
    p[0]=a[0]+b[0];
    p[1]=a[1]+b[1];
}
void mult(complex a,complex b,complex p)
{
    p[0]=a[0]*b[0]-a[1]*b[1];
    p[1]=a[0]*b[1]+a[1]*b[0];
}
float mag2(complex a)
{
    return (a[0]*a[0]+a[1]*a[1]);
}
void form(float a,float b,complex p)
{
    p[0]=a;
    p[1]=b;
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawPixels(n,m,GL_COLOR_INDEX,GL_UNSIGNED_BYTE,image);
}
void myReshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        gluOrtho2D(0.0, 0.0, (GLfloat) n,(GLfloat)m* (GLfloat ) h /
        (GLfloat) w);
    else
        gluOrtho2D(0.0, 0.0, (GLfloat)n*(GLfloat) w / (GLfloat) h,
        (GLfloat) m);
    glMatrixMode(GL_MODELVIEW);
    glutPostRedisplay();
}
void myinit()
{
    float redmap[256],greenmap[256],bluemap[256];
    int i;
    glClearColor (1.0, 1.0, 1.0, 1.0);
    gluOrtho2D(0.0, 0.0, (GLfloat)n, (GLfloat)m);
    /* define pseudocolor maps,ramps for red and blue,
    random for green */
    for(i=0;i<256;i++)
    {
        redmap[i]=i/255.0;
        greenmap[i]=rand()%255/255.0;
        bluemap[i]=1.0-i/255;
    }
    glPixelMapfv(GL_PIXEL_MAP_I_TO_R,256,redmap);
    glPixelMapfv(GL_PIXEL_MAP_I_TO_G,256,greenmap);
    glPixelMapfv(GL_PIXEL_MAP_I_TO_B,256,bluemap);
}
void main(int argc, char **argv)
{
    int i,j,k;
    float x,y,v;
    complex c0,c,d;
    scanf("%f",&cx);/*center x*/
    scanf("%f",&cy); /*center y*/
    scanf("%f",&width); /*rectangle width*/
    height = width; /*rectangle height*/
    scanf("%d",&max); /*maximum iteration*/
    for(i=0;i<n;i++)for(j=0;j<m;j++)
    {
        /* starting point */
        x=i*(width/(n-1))+cx-width/2;
        y=j*(height/(m-1))+cy-height/2;
        form(0,0,c);
        form(x,y,c0);
        /* complex iteration */
        for(k=0;k<max;k++)
        {
            mult(c,c,d);
            add(d,c0,c);
            v=mag2(c);
            if(v>4.0) break ;/* assume not in set if mag>4 */
        }
        /*assign gray level to point based on its magnitude*/
        if(v>1.0) v=1.0; /* clamp if v>1 */
        image[i][j]=255*v;
    }
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize(N,M);
    glutCreateWindow("Mandelbrot set");
    myinit();
    glutReshapeFunc(myReshape);
    glutDisplayFunc(display);
    glutMainLoop();
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值