Передача в функцию параметров проекции
У меня возникла проблема: Проблема с вызовом функции 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();
}