Я новичок в OpenGL. Поэтому мне нужна помощь в вопросе, описанном ниже. Я не уверен, как создать координаты области просмотра относительно координат экрана, а также создать их на С++, так как я имел дело с Java.
В этом вопросе мне нужно реализовать функцию worldToViewportTransform.
Функция реализует матрицу двумерной ортогональной проекции, которая используется для преобразования (мирового) окна в окно просмотра. В OpenGL эта матрица определяется gluOrtho2D.
Входными данными являются координаты мирового окна (winLeft, winRight, winBottom, winTop), левого верхнего угла области просмотра (окна) на экране (windowX, windowY) и размер области просмотра (окна) на экране. экран (ширина окна, высота окна).
Выходные данные — это значения A, B, C и D, которые составляют преобразование мира в окно просмотра.
В ответе необходимо использовать формат функции ниже — скопируйте его и заполните недостающий код. Функция использует переменные-указатели для значений A, B, C и D, поскольку Coderunner, похоже, не принимает нотацию C++ — сегмент кода ниже преобразует переменные-указатели в двойные значения и обратно, поэтому вам не нужно понимать, как работают указатели. .
void worldToViewportTransform (double winLeft, double winRight, double winBottom, double winTop,
int windowX, int windowY, int windowWidth, int windowHeight,
double* APtr, double* BPtr, double* CPtr, double* DPtr)
{
double A=*APtr, B=*BPtr, C=*CPtr, D=*DPtr;
<INSERT YOUR CODE HERE>
*APtr=A; *BPtr=B; *CPtr=C; *DPtr=D;
}
Конкретный тестовый пример должен давать результат: (u, v) = (-200 367)
//Code for Testing
double A, B, C, D;
double winLeft=1.5, winRight=4.5, winBottom=0.0, winTop=3.0;
int windowX=100, windowY=100, windowWidth=600, windowHeight=400;
worldToViewportTransform(winLeft, winRight, winBottom, winTop,
windowX, windowY, windowWidth, windowHeight,
&A, &B, &C, &D);
// Test cases
double x, y; // world coordinates
int u, v; // window coordinates
x=0.0f; y=1.0f;
u=(int) floor(A*x+C+0.5f);
v=(int) floor(B*y+D+0.5f);
printf("(u,v)=(%d,%d)",u,v);