1

opengl/c++ を使用してマンデルブロー集合を描画し、ズームインしようとしています。初めてズームして、必要な場所を(クリックして)ズームすることができますが、次にズームしようとすると、ズームするつもりだった場所がズームされず、代わりにシフトしてズームしたい場所から少し離れてズームしますズーム。私が使う

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

デカルト座標 [-2,2] の観点からマウスがクリックされた場所を計算する

px と py はピクセル座標です

4

1 に答える 1

2

変数が多すぎます。画像の幅を定義するものは何ですか? (right - left)? baseSize + f(zoomLevel)? SizeReal? 誰が誰に使われるかを設定するのが誰の仕事なのかが明確でないため、すべてを一貫して更新することは期待できません。

また、ズームするたびに画像サイズが半分になるのに、なぜdividecubesby500 ずつ増加するのでしょうか? クリックされた座標の制限を定義するウィンドウ システム ウィンドウの幅/高さはどこですか?

私の提案は、ゼロから始めて、誰が誰を更新したかのグラフを描くことです ( left/right -> imageWidth)。描画ウィンドウ (左/右/上/下) に関係なく、正しいクリック座標を取得していることを確認し、そこから先に進みます。そのままでは、最初のズームが偶然に正しく機能したと思います。

于 2012-11-08T19:34:39.197 に答える