Передача в функцию параметров проекции

У меня возникла проблема: Проблема с вызовом функции MyViewport& view У меня view - это параметры проекции, которые необходимо рассчитать (по должному счету в MyViewport createView):

view.left - add, view.right + add,
    view.bottom - add, view.top + add,
    view.znear, view.zfar

Но что делать дальше? Принципиально вопрос в том, что необходимо еще указать, инициализировать для проекции. Прошу экспертного мнения, так как просто запутался. Прикладываю тело основной функции в первую очередь:

    printf("Введите необходимое количество элементов массива:\n");
    scanf("%d",&n);

    printf("\n");
    int* A=new int[n];
    int* B=new int[n];
    int screenH = 640; // 
    int screenW = 640; //

    createView(A, B, n, screenW, screenH);                     
    Display(A, B, n, MyViewport& view);

//-------------------------------------
 //Объявление структур и функций перед main.cpp

    struct MyViewport
    {   // параметры проекции
        float left;
        float right;
        float bottom;
        float top;
        float znear;
        float zfar;

        MyViewport(float l, float r, float b, float t, float zn, float zf)
            : left(l), right(r), bottom(b), top(t), znear(zn), zfar(zf)
        {}
    };
    /////////////////////////////////////////////////////////////////////////////
    MyViewport createView(int* x, int* y, int n, int screenW, int screenH)
    {   // функция создаёт параметры проекции,
        // что бы все точки поместились на экране
        // с сохранением пропорций
        // входные параметры:
        //[in] x - массив x координат
        //[in] y - массив y координат
        //[in] n - количество точек
        //[in] screenW - ширина экрана(окна)
        //[in] screenH - высота экрана(окна)

        float minX = x[0];
        float maxX = minX;
        float minY = y[0];
        float maxY = minY;

        // находим мин/макс координаты
        for (int i = 1; i < n; ++i)
        {
            if (x[i] < minX) minX = x[i];
            else if (maxX < x[i]) maxX = x[i];

            if (y[i] < minY) minY = y[i];
            else if (maxY < y[i]) maxY = y[i];
        }

        float screenRatio = (float)screenW / screenH;
        float pointsRatio = (maxX - minX) / (maxY - minY);
        // масштабируем нужную ось
        if (screenRatio > pointsRatio)
        {
            const float factor = screenRatio / pointsRatio;
            minX *= factor;
            maxX *= factor;
        }
        else
        {
            const float factor = pointsRatio / screenRatio;
            minY *= factor;
            maxY *= factor;
        }

        return MyViewport(minX, maxX, minY, maxY, 0, 1);
    }
    /////////////////////////////////////////////////////////////////////////////
    void Display(int* x, int* y, int n, const MyViewport& view)
    {   // функция отрисовки
        // входные параметры:
        //[in] x - массив x координат
        //[in] y - массив y координат
        //[in] n - количество точек
        //[in] view - ранее посчитанные параметры проекции

        // размер точки
        const int pointSize = 8;

        glClear(GL_COLOR_BUFFER_BIT);

        // формируем матрицу проекции
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        // добавка для расширения вьюпорта,
        // что бы все точки поместились с учетом размера точки
        const float add = pointSize / 2;
        glOrtho(
            view.left - add, view.right + add,
            view.bottom - add, view.top + add,
            view.znear, view.zfar
        );

        // рисуем точки
        glPointSize(pointSize);
        glBegin(GL_POINTS);
        {
            glColor3f(1, 0, 0);
            for (int i = 0; i < n; ++i)
            {
                glVertex2f(x[i], y[i]);
            }
        }
        glEnd();

        // рисуем оси для наглядности
        glBegin(GL_LINES);
        {   
            glColor3f(0, 1, 0);
            glVertex2f(view.left, 0);
            glVertex2f(view.right, 0);
            glVertex2f(0, view.top);
            glVertex2f(0, view.bottom);
        }
        glEnd();
    }

Ответы (0 шт):