Window to Viewport Transformation in Computer Graphics with Implementation

04 Jun, 2021
Window to Viewport Transformation is the process of transforming 2D world-coordinate objects to device coordinates. Objects inside the world or clipping window are mapped to the viewport which is the area on the screen where world coordinates are mapped to be displayed. 
General Terms: 
World coordinate – It is the Cartesian coordinate w.r.t which we define the diagram, like Xwmin, Xwmax, Ywmin, Ywmax
Device Coordinate –It is the screen coordinate where the objects are to be displayed, like Xvmin, Xvmax, Yvmin, Yvmax
Window –It is the area on world coordinate selected for display.
ViewPort –It is the area on the device coordinate where graphics is to be displayed.
Mathematical Calculation of Window to Viewport: It may be possible that the size of the Viewport is much smaller or greater than the Window. In these cases, we have to increase or decrease the size of the Window according to the Viewport and for this, we need some mathematical calculations.
(xw, yw): A point on Window
(xv, yv): Corresponding  point on Viewport
we have to calculate the point (xv, yv) 
 
Now the relative position of the object in Window and Viewport are same.
For x coordinate,                        
 
 
 For y coordinate,
 
so, after calculating for x and y coordinate, we get 
where sx is the scaling factor of x coordinate and sy is the scaling factor of y coordinate 
Example:Lets assume, 
for window, Xwmin = 20, Xwmax = 80, Ywmin = 40, Ywmax = 80.
for viewport, Xvmin = 30, Xvmax = 60, Yvmin = 40, Yvmax = 60.
Now a point ( Xw, Yw ) be ( 30, 80 ) on the window. We have to calculate that point on the viewport i.e ( Xv, Yv ).
First of all, calculate the scaling factor of x coordinate Sx and the scaling factor of y coordinate Sy using the above-mentioned formula.
Sx = ( 60 - 30 ) / ( 80 - 20 ) = 30 / 60
Sy = ( 60 - 40 ) / ( 80 - 40 ) = 20 / 40
So, now calculate the point on the viewport ( Xv, Yv ).
Xv = 30 + ( 30 - 20 ) * ( 30 / 60 ) = 35
Yv = 40 + ( 80 - 40 ) * ( 20 / 40 ) = 60
So, the point on window ( Xw, Yw ) = ( 30, 80 ) will be ( Xv, Yv ) = ( 35, 60 ) on viewport.
Here is the implementation of the above approach:
C++
C
Java
Python3
C#
Javascript
// C++ program to implement// Window to ViewPort Transformation #include <iostream>using namespace std; // Function for window to viewport transformationvoid WindowtoViewport(int x_w, int y_w, int x_wmax,                      int y_wmax, int x_wmin, int y_wmin,                      int x_vmax, int y_vmax, int x_vmin,                      int y_vmin){    // point on viewport    int x_v, y_v;     // scaling factors for x coordinate and y coordinate    float sx, sy;     // calculating Sx and Sy    sx = (float)(x_vmax - x_vmin) / (x_wmax - x_wmin);    sy = (float)(y_vmax - y_vmin) / (y_wmax - y_wmin);     // calculating the point on viewport    x_v = x_vmin + (float)((x_w - x_wmin) * sx);    y_v = y_vmin + (float)((y_w - y_wmin) * sy);     cout<< "The point on viewport: ("<<x_v  <<","<< y_v<<")" ;} // Driver Codeint main(){    // boundary values for window    int x_wmax = 80, y_wmax = 80, x_wmin = 20, y_wmin = 40;     // boundary values for viewport    int x_vmax = 60, y_vmax = 60, x_vmin = 30, y_vmin = 40;     // point on window    int x_w = 30, y_w = 80;     WindowtoViewport(30, 80, 80, 80, 20, 40, 60, 60, 30, 40);} // This code is contributed by khusboogoyal499.
// C program to implement// Window to ViewPort Transformation #include <stdio.h> // Function for window to viewport transformationvoid WindowtoViewport(int x_w, int y_w, int x_wmax,                      int y_wmax, int x_wmin, int y_wmin,                      int x_vmax, int y_vmax, int x_vmin,                      int y_vmin){    // point on viewport    int x_v, y_v;     // scaling factors for x coordinate and y coordinate    float sx, sy;     // calculating Sx and Sy    sx = (float)(x_vmax - x_vmin) / (x_wmax - x_wmin);    sy = (float)(y_vmax - y_vmin) / (y_wmax - y_wmin);     // calculating the point on viewport    x_v = x_vmin + (float)((x_w - x_wmin) * sx);    y_v = y_vmin + (float)((y_w - y_wmin) * sy);     printf("The point on viewport: (%d, %d )\n ", x_v, y_v);} // Driver Codevoid main(){    // boundary values for window    int x_wmax = 80, y_wmax = 80, x_wmin = 20, y_wmin = 40;     // boundary values for viewport    int x_vmax = 60, y_vmax = 60, x_vmin = 30, y_vmin = 40;     // point on window    int x_w = 30, y_w = 80;     WindowtoViewport(30, 80, 80, 80, 20, 40, 60, 60, 30, 40);} //this code is added by khushboogoyal499
// Java program to implement// Window to ViewPort Transformationclass GFG{ // Function for window to viewport transformationstatic void WindowtoViewport(int x_w, int y_w, int x_wmax,                    int y_wmax, int x_wmin, int y_wmin,                    int x_vmax, int y_vmax, int x_vmin,                    int y_vmin){    // point on viewport    int x_v, y_v;     // scaling factors for x coordinate and y coordinate    float sx, sy;     // calculating Sx and Sy    sx = (float)(x_vmax - x_vmin) / (x_wmax - x_wmin);    sy = (float)(y_vmax - y_vmin) / (y_wmax - y_wmin);     // calculating the point on viewport    x_v = (int) (x_vmin + (float)((x_w - x_wmin) * sx));    y_v = (int) (y_vmin + (float)((y_w - y_wmin) * sy));     System.out.printf("The point on viewport: (%d, %d )\n ", x_v, y_v);} // Driver Codepublic static void main(String[] args){     // boundary values for window    int x_wmax = 80, y_wmax = 80, x_wmin = 20, y_wmin = 40;     // boundary values for viewport    int x_vmax = 60, y_vmax = 60, x_vmin = 30, y_vmin = 40;     // point on window    int x_w = 30, y_w = 80;     WindowtoViewport(30, 80, 80, 80, 20, 40, 60, 60, 30, 40);}} // This code is contributed by Rajput-Ji
# Python3 program to implement# Window to ViewPort Transformation # Function for window to viewport transformationdef WindowtoViewport(x_w, y_w, x_wmax, y_wmax,                       x_wmin, y_wmin, x_vmax,                       y_vmax, x_vmin, y_vmin):                                # point on viewport    # calculating Sx and Sy    sx = (x_vmax - x_vmin) / (x_wmax - x_wmin)    sy = (y_vmax - y_vmin) / (y_wmax - y_wmin)     # calculating the point on viewport    x_v = x_vmin + ((x_w - x_wmin) * sx)    y_v = y_vmin + ((y_w - y_wmin) * sy)     print("The point on viewport:(", int(x_v),                                ",", int(y_v), ")") # Driver Codeif __name__ == '__main__':         # boundary values for window    x_wmax = 80    y_wmax = 80    x_wmin = 20    y_wmin = 40     # boundary values for viewport    x_vmax = 60    y_vmax = 60    x_vmin = 30    y_vmin = 40     # point on window    x_w = 30    y_w = 80     WindowtoViewport(30, 80, 80, 80, 20,                     40, 60, 60, 30, 40)     # This code is contributed by Surendra_Gangwar
// C# program to implement// Window to ViewPort Transformationusing System; class GFG{ // Function for window to viewport transformationstatic void WindowtoViewport(int x_w, int y_w,                             int x_wmax, int y_wmax,                             int x_wmin, int y_wmin,                             int x_vmax, int y_vmax,                             int x_vmin, int y_vmin){    // point on viewport    int x_v, y_v;     // scaling factors for x coordinate    // and y coordinate    float sx, sy;     // calculating Sx and Sy    sx = (float)(x_vmax - x_vmin) /                (x_wmax - x_wmin);    sy = (float)(y_vmax - y_vmin) /                (y_wmax - y_wmin);     // calculating the point on viewport    x_v = (int) (x_vmin +        (float)((x_w - x_wmin) * sx));    y_v = (int) (y_vmin +        (float)((y_w - y_wmin) * sy));     Console.Write("The point on viewport: " +                 "({0}, {1} )\n ", x_v, y_v);} // Driver Codepublic static void Main(String[] args){     // boundary values for window    int x_wmax = 80, y_wmax = 80,        x_wmin = 20, y_wmin = 40;     // boundary values for viewport    int x_vmax = 60, y_vmax = 60,        x_vmin = 30, y_vmin = 40;     // point on window    int x_w = 30, y_w = 80;     WindowtoViewport(30, 80, 80, 80, 20,                     40, 60, 60, 30, 40);}} // This code is contributed by PrinciRaj1992
<script>// Javascript program to implement// Window to ViewPort Transformation // Function for window to viewport transformationfunction WindowtoViewport(x_w, y_w, x_wmax,y_wmax, x_wmin,                    y_wmin,x_vmax, y_vmax, x_vmin,y_vmin){    // point on viewport    let x_v, y_v;     // scaling factors for x coordinate and y coordinate    let sx, sy;     // calculating Sx and Sy    sx = (x_vmax - x_vmin) / (x_wmax - x_wmin);    sy = (y_vmax - y_vmin) / (y_wmax - y_wmin);     // calculating the point on viewport    x_v = x_vmin + ((x_w - x_wmin) * sx);    y_v = y_vmin + ((y_w - y_wmin) * sy);     document.write("The point on viewport: (" + x_v + ", "                                + y_v + " )<br>");} // Driver Code    // boundary values for window    let x_wmax = 80, y_wmax = 80, x_wmin = 20, y_wmin = 40;     // boundary values for viewport    let x_vmax = 60, y_vmax = 60, x_vmin = 30, y_vmin = 40;     // point on window    let x_w = 30, y_w = 80;     WindowtoViewport(30, 80, 80, 80, 20, 40, 60, 60, 30, 40); </script>
The point on viewport: (35, 60 )
 
soumya7
Akanksha_Rai
Rajput-Ji
princiraj1992
SURENDRA_GANGWAR
subham348
anikaseth98
khushboogoyal499
computer-graphics
Geometric
Mathematical
Mathematical
Geometric
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Program for distance between two points on earth
Optimum location of point to minimize total distance
Convex Hull | Set 1 (Jarvis's Algorithm or Wrapping)
Check whether a given point lies inside a triangle or not
Program for Point of Intersection of Two Lines
Program for Fibonacci numbers
Set in C++ Standard Template Library (STL)
Write a program to print all permutations of a given string
C++ Data Types
Merge two sorted arrays