C++ 第二次缩放mandelbrot集不允许它在所需位置进行缩放

C++ 第二次缩放mandelbrot集不允许它在所需位置进行缩放,c++,c,opengl,mandelbrot,C++,C,Opengl,Mandelbrot,我正在使用opengl/c++绘制mandelbrot集并尝试放大。我可以第一次缩放并缩放到我想要的地方(通过单击),但当我下次尝试缩放时,它不会缩放到我想要缩放的地方,而是会移动并缩放到离我想要缩放的地方稍远的地方。 我用 #包括 #包括 #包括 #包括 #包括 #包括 双等分立方=700; 左双=-2.0; 双右=2.0; 双底=-2.0; 双层顶=2.0; int-maxiteration=128; int zoomlevel=3; 双基尺寸=4.0; 双尺寸=0.0; 双xco=0.0;

我正在使用opengl/c++绘制mandelbrot集并尝试放大。我可以第一次缩放并缩放到我想要的地方(通过单击),但当我下次尝试缩放时,它不会缩放到我想要缩放的地方,而是会移动并缩放到离我想要缩放的地方稍远的地方。 我用

#包括
#包括
#包括
#包括
#包括
#包括
双等分立方=700;
左双=-2.0;
双右=2.0;
双底=-2.0;
双层顶=2.0;
int-maxiteration=128;
int zoomlevel=3;
双基尺寸=4.0;
双尺寸=0.0;
双xco=0.0;
双yco=0.0;
void SetXYpos(int px,int py)
{
xco=左+(右-左)*px/除以立方;
yco=顶部-(顶部-底部)*py/分割立方;
}
按下void键(无符号字符键,整数x,整数y)
{
int xx=x;
int-yy=y;
setXYpos(xx,yy);
尺寸=0.5*(功率(2.0,(-zoomlevel));
开关(钥匙){
案例“z”:
左=xco-尺寸;
右=xco+尺寸;
底部=yco-尺寸;
top=yco+尺寸;
dividecubesby=dividecubesby+100;
maxiteration=maxiteration+100;
zoomlevel=zoomlevel+1;
再发现();
打破
}
}
内部测试(双Cr,双Ci)
{
双Zr=0.0;
双Zi=0.0;
整数倍=0;
双温;
Zr=Zr+Cr;
Zi=Zi+Ci;

而(((Zr*Zr)+(Zi*Zi))变量太多了。是什么定义了图像的宽度?
(右-左)
baseSize+f(zoomLevel)
SizeReal
?不清楚谁的任务是设置谁以及谁使用谁,所以你不能希望所有的内容都得到一致的更新

另外,为什么
dividecubesby
会增加一个单位500,而图像大小会随着每次缩放而减半?定义单击坐标限制的窗口系统窗口的宽度/高度在哪里


我的建议是从头开始,也许画一张谁更新谁的图表(
left/right->imageWidth
)。确保获得正确的单击坐标,而不受绘图窗口(left/right/top/bottom)的影响是的,从那里继续。事实上,我认为您的第一次缩放工作正常是偶然的。

请发布一些代码,或者-如果您使用的是已知程序-您认为它是系统的一部分的代码problem@linello谢谢你的回复…我已经将一些代码编辑成我以前的代码…很抱歉是messymmh…你为什么要使用ng keyboard press callback获取鼠标位置?如果您实现鼠标回调,而不是使用键盘按键获取(x,y)位置,那会更好鼠标坐标。该问题源于错误地使用按键功能而不是mouseFunc,因此请尝试删除键盘按键中的setXYpos并实现mouseFunc,这将允许您在我尝试使用鼠标的鼠标的实际坐标中应用转换,但问题仍然存在(根本没有更改)…它为两种情况提供的坐标相同(以像素形式)…我不认识人…第一种情况下它工作得很好,第二种、第三种情况下,它只是从我点击的位置移开…我想SizeReal和SizeImage可能会引起问题,但仍然不能确定…是的,使用鼠标按钮比使用键盘按钮容易得多…否则我必须在如果我想放大,然后按“z”…现在只需单击即可。谢谢您的建议:)谢谢aib的夸奖我有点理解你说的话,并且做了一点修改…我已经编辑了上面的问题…请你也评论一下…修改后效果或多或少会更好…让我知道我是否做对了…至少现在它起作用了…但我担心这是否是一个好的解决方案:(@gunda:看来你没有解决我的大部分问题。你应该从头开始。这通常比处理像这样凌乱的代码容易得多。
#include <GL/gl.h>
#include <GL/glu.h>
#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 Size = 0.0;
double xco=0.0;
double yco=0.0;

    void   SetXYpos(int px,int py)
    {
        xco = left+(right-left)*px/dividecubesby;
        yco = top-(top-bottom)*py/dividecubesby;
    }

   void keyPressed(unsigned char key, int x, int y)
   {

       int xx= x;
       int yy= y;
       setXYpos(xx,yy);


       Size = 0.5*(pow(2.0, (-zoomlevel)));



       switch(key){

       case 'z':

      left   =  xco -  Size;
      right  =  xco +  Size;
      bottom =  yco -  Size;
      top    =  yco +  Size;

      dividecubesby = dividecubesby+100;        
      maxiteration  = maxiteration+100; 
  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(void)
 {

    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f,1.0f,1.0f);
    double deltax = ((right - left)/(dividecubesby-1));
    double deltay = ((top- bottom)/(dividecubesby-1));

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    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();
}