масштабирование набора мандельброта второй раз не дает масштабировать в нужном месте

Я использую opengl/С++ для рисования набора Мандельброта и пытаюсь увеличить масштаб. Я могу масштабировать в первый раз и масштабировать там, где я хочу (нажав), но когда я пытаюсь увеличить масштаб в следующий раз, он не масштабируется там, где я намеревался увеличить, вместо этого он смещается и масштабируется немного далеко от места, которое я хочу зум. я использую

#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 - координата пикселя


person solti    schedule 06.11.2012    source источник
comment
пожалуйста, опубликуйте какой-нибудь код или, если вы используете известную программу, фрагмент кода, который, по вашему мнению, является частью проблемы.   -  person linello    schedule 07.11.2012
comment
@linello спасибо за ответ ... я отредактировал кое-какой код в своем предыдущем коде .. извините за беспорядок   -  person solti    schedule 08.11.2012
comment
ммх ... почему вы используете обратный вызов keyboardPress, чтобы получить положение мыши? Было бы лучше, если бы вы реализовали обратный вызов мыши, а не использовали нажатие клавиатуры для получения (x, y) координаты мыши. Проблема возникает из-за неправильно понятого использования функции keyPressed вместо mouseFunc, поэтому попробуйте удалить setXYpos при нажатии на клавиатуре и реализовать mouseFunc, это позволит применить преобразование к фактической координате мыши. opengl.org/resources/libraries/glut/spec3/node50.html< /а>   -  person linello    schedule 08.11.2012
comment
Я пробовал и с мышью, но проблема не устранена (никаких изменений вообще) ... координата, которую она дает, одинакова для обоих случаев (в форме пикселей) ... я не знаю, чувак ... в первом случае это работает отлично это второй, третий и т. д. случаи, когда он просто смещается и удаляется от места, на которое я нажал. Я думаю, что SizeReal и SizeImage могут вызвать проблему, но все еще не могу сказать наверняка. И да, использование mouseFunc намного проще, чем нажатие на клавиатуре. .. в противном случае мне пришлось бы поместить мышь в то место, где я хочу увеличить масштаб, а затем нажать «z» .. теперь достаточно одного щелчка, спасибо за это предложение :)   -  person solti    schedule 08.11.2012


Ответы (1)


У вас слишком много переменных. Что определяет ширину вашего изображения? (right - left)? baseSize + f(zoomLevel)? SizeReal? Неясно, чья работа заключается в том, чтобы устанавливать, кого и кто кем использует, поэтому вы не можете надеяться на постоянное обновление всего.

Кроме того, почему dividecubesby увеличивается на 500, а размер изображения уменьшается вдвое при каждом увеличении? Где ширина/высота окна вашей оконной системы, которые определяют пределы нажатых координат?

Я предлагаю начать с нуля и, возможно, нарисовать график того, кто кого обновляет (left/right -> imageWidth). Убедитесь, что вы получаете правильные координаты щелчка независимо от того, какое у вас окно рисования (слева/справа/сверху/снизу), и продолжайте оттуда. Как бы то ни было, я думаю, что ваш первый зум работает правильно случайно.

person aib    schedule 08.11.2012
comment
Спасибо, aib, за комплимент, я как бы понял, что вы сказали, и немного изменил ... я отредактировал приведенный выше вопрос ... пожалуйста, не могли бы вы также прокомментировать это ... после изменения он работает более или менее лучше .. пусть я знаю, правильно ли я это сделал или нет ... по крайней мере, пока это работает ... но я боюсь, хорошее это решение или нет :( - person solti; 09.11.2012
comment
@gunda: похоже, вы не ответили на большинство моих проблем. Вы должны начать с нуля. Обычно это намного проще, чем иметь дело с таким запутанным кодом. - person aib; 10.11.2012