gpt4 book ai didi

c++ - Mandelbrot 缩放但图像移动并缩小

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:24:44 24 4
gpt4 key购买 nike

我一直在做 Mandelbrot 集并尝试缩放,但缩放模式变得非常麻烦。当我缩放时,它会完美缩放,但图像尺寸会缩小到原始尺寸的一半。下次我再次缩放时,图片尺寸会增加并尝试跳过查看窗口。代码在 c++/opengl 中。在发布到这里之前,我试图让我的代码干净一些。

#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

double dividecubesby = 700;
double left = -2.0;
double right = 2.0;
double bottom = -2.0;
double top = 2.0;
int maxiteration = 128;
int zoomlevel = 3;
double baseSize = 4.0;
double SizeReal;
double SizeImage;
double xco=0.0;
double yco=0.0;

void whatcoordinate(int x,int y)
{
int xp=x;
int yp=y;
double delta1 = (right-left);
double tempx;
double tempy;
double delta=0.0;
double l = dividecubesby/2;

delta = delta1/dividecubesby;

if((xp > l) && (yp < l))
{
tempx = xp*delta;
tempy = yp*delta;

xco = right - tempx;
yco = top - tempy;

if(xco <0)xco=xco*-1;
if(yco <0)yco=yco*-1;
}
else if( (x < l) && (y < l))
{
tempx = xp*delta;
tempy = yp*delta;

xco = right - tempx;
yco = top - tempy;

if(xco >0)xco=xco*-1;
if(yco <0) yco =yco*-1;
}
else if((x < l) && (y > l))
{
tempx = xp*delta;
tempy = yp*delta;

xco = right - tempx;
yco = top - tempy;

if(xco >0)xco=xco*-1;
if(yco >0)yco=yco*-1;
}
else if((x > l) && (y > l))
{
tempx = xp*delta;
tempy = yp*delta;

xco = right - tempx;
yco = right - tempy;

if(xco <0)xco=xco*-1;
if(yco >0)yco=yco*-1;
}
}

void keyPressed(unsigned char key, int x, int y)
{
switch(key)
{
case 'z':
printf("z pressed x= %d, y= %d \n",x,y);

whatcoordinate(x,y);

SizeReal = (pow(2.0, (-zoomlevel)))*baseSize;
SizeImage = (pow(2.0, (-zoomlevel)))*baseSize;

baseSize = right-left;

left = xco- (SizeReal/2);
right = xco + (SizeReal/2);
bottom = yco - (SizeReal/2);
top = yco + (SizeReal/2);
dividecubesby = dividecubesby+500;
maxiteration = maxiteration+500;
zoomlevel=zoomlevel+1;

glutPostRedisplay();

break;
}
}

int mandtest(double Cr, double Ci)
{
double Zr = 0.0;
double Zi = 0.0;
int times = 0;
double temp;
Zr = Zr+Cr;
Zi = Zi+Ci;

while ((((Zr*Zr)+(Zi*Zi))<=4) && (times < maxiteration))
{
temp = (Zr*Zr)-(Zi*Zi);
Zi = 2*Zr*Zi;

Zr = temp+Cr;
Zi = Zi+Ci;

times = times+1;

}

return times;
}

void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,1.0f,1.0f);
double deltax = ((right - left)/(dividecubesby-1));//this means length/700
double deltay = ((top- bottom)/(dividecubesby-1));// this means length/700

gluOrtho2D(left,right,bottom,top);
glBegin(GL_POINTS);

for(double x= left;x<=right;x += deltax )
{
for(double y= bottom; y<=top;y += deltay )
{
if((mandtest(x,y))==maxiteration)
{
glColor3f(1.0f,1.0f,1.0f);
glVertex2f(x,y);
}
else
{
glColor3f((float)mandtest(x,y)/10,0.0f,(float)mandtest(x,y)/30);
glVertex2f(x,y);
}
}
}
glEnd();

glFlush();
}

void init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
}

int main(int argc, char ** argv)
{
glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(dividecubesby,dividecubesby);
glutCreateWindow("A Simple OpenGL Windows Application with GLUT");
init();
glutDisplayFunc(display);
glutKeyboardFunc(keyPressed);
glutMainLoop();

return 0;
}

执行时

1) enter image description here

2) enter image description here

3) enter image description here

最佳答案

我认为您不应该在每次重新渲染时使用 gluOrtho2D(left,right,bottom,top) 更改 View 转换。只需给它们(初始)固定值。 View 将保持不变,如图 1) 所示。您应该只转换传递给 Mandelbrot 函数的坐标。

正如@genpfault 提到的:考虑使用纹理。这样效率更高。

关于c++ - Mandelbrot 缩放但图像移动并缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13145378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com