Algoritmo de recorte de puntos en gráficos por computadora

Recorte: en los gráficos por computadora, nuestra pantalla actúa como un sistema de coordenadas 2-D. no es necesario que todos y cada uno de los puntos se puedan ver en nuestro panel de visualización (es decir, la pantalla de nuestra computadora). Podemos ver puntos, que se encuentran en un rango particular (0,0) y (Xmax, Ymax). Por lo tanto, el recorte es un procedimiento que identifica aquellas partes de una imagen que están dentro o fuera de nuestro panel de visualización. 
En caso de recorte de puntos, solo mostramos/imprimimos puntos en nuestra ventana que están dentro del rango de nuestro panel de visualización, otros puntos que están fuera del rango se descartan. 
Ejemplo 
 

Input :
 
Output :

Algoritmo de recorte de puntos: 
 

  1. Obtenga las coordenadas mínimas y máximas de ambos paneles de visualización.
  2. Obtener las coordenadas de un punto.
  3. Compruebe si la entrada dada se encuentra entre la coordenada mínima y máxima del panel de visualización.
  4. En caso afirmativo, muestre el punto que se encuentra dentro de la región; de lo contrario, descártelo.

C++

// C++ program for point clipping Algorithm
#include <bits/stdc++.h>
using namespace std;
 
// Function for point clipping
void pointClip(int XY[][2], int n, int Xmin, int Ymin,
                                int Xmax, int Ymax)
{
    /*************** Code for graphics view
    // initialize graphics mode
    detectgraph(&gm,&gr);
    initgraph(&gm,&gr,"d:\\tc\\BGI");
    for (int i=0; i<n; i++)
    {
    if ( (XY[i][0] >= Xmin) && (XY[i][0] <= Xmax))
    {
            if ( (XY[i][1] >= Ymin) && (XY[i][1] <= Ymax))
        putpixel(XY[i][0],XY[i][1],3);
    }
    }
    **********************/
    /**** Arithmetic view ****/
    cout << "Point inside the viewing pane:" << endl;
    for (int i = 0; i < n; i++)
    {
        if ((XY[i][0] >= Xmin) && (XY[i][0] <= Xmax))
        {
            if ((XY[i][1] >= Ymin) && (XY[i][1] <= Ymax))
                cout <<"[" << XY[i][0] <<","<<XY[i][1]<<"] ";
        }
    }
 
    // print point coordinate outside viewing pane
    cout<<"\n"<< endl;
    cout << "Point outside the viewing pane:"<<endl;
    for (int i = 0; i < n; i++)
    {
        if ((XY[i][0] < Xmin) || (XY[i][0] > Xmax))
            cout << "[" << XY[i][0] << "," << XY[i][1] << "] ";
        if ((XY[i][1] < Ymin) || (XY[i][1] > Ymax))
            cout << "[" << XY[i][0] << "," << XY[i][1] << "] ";
    }
}
 
// Driver code
int main()
{
    int XY[6][2] = {{10, 10}, {-10, 10}, {400, 100},
                    {100, 400}, {400, 400}, {100, 40}};
 
    // getmaxx() & getmaxy() will return Xmax, Ymax
    // value if graphics.h is included
    int Xmin = 0;
    int Xmax = 350;
    int Ymin = 0;
    int Ymax = 350;
    pointClip(XY, 6, Xmin, Ymin, Xmax, Ymax);
    return 0;
}
 
// This code is contributed by SHUBHAMSINGH10

C

// C program for point clipping Algorithm
#include<stdio.h>
//#include<graphics.h>
 
// Function for point clipping
void pointClip(int XY[][2], int n, int Xmin, int Ymin,
                                   int Xmax, int Ymax)
{
    /*************** Code for graphics view
    // initialize graphics mode
    detectgraph(&gm,&gr);
    initgraph(&gm,&gr,"d:\\tc\\BGI");
    for (int i=0; i<n; i++)
    {
    if ( (XY[i][0] >= Xmin) && (XY[i][0] <= Xmax))
    {
            if ( (XY[i][1] >= Ymin) && (XY[i][1] <= Ymax))
        putpixel(XY[i][0],XY[i][1],3);
    }
    }
    **********************/
    /**** Arithmetic view ****/
    printf ("Point inside the viewing pane:\n");
    for (int i=0; i<n; i++)
    {
        if ((XY[i][0] >= Xmin) && (XY[i][0] <= Xmax))
        {
            if ((XY[i][1] >= Ymin) && (XY[i][1] <= Ymax))
                printf ("[%d, %d] ", XY[i][0], XY[i][1]);
        }
    }
 
    // print point coordinate outside viewing pane
    printf ("\nPoint outside the viewing pane:\n");
    for (int i=0; i<n; i++)
    {
        if ((XY[i][0] < Xmin) || (XY[i][0] > Xmax))
            printf ("[%d, %d] ", XY[i][0], XY[i][1]);
        if ((XY[i][1] < Ymin) || (XY[i][1] > Ymax))
            printf ("[%d, %d] ", XY[i][0], XY[i][1]);
    }
}
 
// Driver code
int main()
{
    int XY[6][2] = {{10,10}, {-10,10}, {400,100},
                    {100,400}, {400,400}, {100,40}};
 
    // getmaxx() & getmaxy() will return Xmax, Ymax
    // value if graphics.h is included
    int Xmin = 0;
    int Xmax = 350;
    int Ymin = 0;
    int Ymax = 350;
    pointClip(XY, 6,  Xmin, Ymin, Xmax, Ymax);
    return 0;
}

Java

// Java program for point clipping Algorithm
class GFG
{
 
// Function for point clipping
static void pointClip(int XY[][], int n,
                        int Xmin, int Ymin,
                        int Xmax, int Ymax)
{
    /*************** Code for graphics view
    // initialize graphics mode
    detectgraph(&gm,&gr);
    initgraph(&gm,&gr,"d:\\tc\\BGI");
    for (int i=0; i<n; i++)
    {
    if ( (XY[i][0] >= Xmin) && (XY[i][0] <= Xmax))
    {
            if ( (XY[i][1] >= Ymin) && (XY[i][1] <= Ymax))
        putpixel(XY[i][0],XY[i][1],3);
    }
    }
    **********************/
    /**** Arithmetic view ****/
    System.out.printf ("Point inside the viewing pane:\n");
    for (int i = 0; i < n; i++)
    {
        if ((XY[i][0] >= Xmin) && (XY[i][0] <= Xmax))
        {
            if ((XY[i][1] >= Ymin) && (XY[i][1] <= Ymax))
                System.out.printf ("[%d, %d] ", XY[i][0], XY[i][1]);
        }
    }
 
    // print point coordinate outside viewing pane
    System.out.printf ("\nPoint outside the viewing pane:\n");
    for (int i=0; i<n; i++)
    {
        if ((XY[i][0] < Xmin) || (XY[i][0] > Xmax))
            System.out.printf ("[%d, %d] ", XY[i][0], XY[i][1]);
        if ((XY[i][1] < Ymin) || (XY[i][1] > Ymax))
            System.out.printf ("[%d, %d] ", XY[i][0], XY[i][1]);
    }
}
 
// Driver code
public static void main(String[] args)
{
        int XY[][] = {{10,10}, {-10,10}, {400,100},
                    {100,400}, {400,400}, {100,40}};
 
    // getmaxx() & getmaxy() will return Xmax, Ymax
    // value if graphics.h is included
    int Xmin = 0;
    int Xmax = 350;
    int Ymin = 0;
    int Ymax = 350;
    pointClip(XY, 6, Xmin, Ymin, Xmax, Ymax);
}
}
 
/* This code contributed by PrinciRaj1992 */

Python3

# Python3 program for point clipping Algorithm
 
# Function for point clipping
def pointClip(XY, n, Xmin, Ymin, Xmax, Ymax):
 
    """************** Code for graphics view
    # initialize graphics mode
    detectgraph(&gm, &gr)
    initgraph(&gm, &gr, "d:\\tc\\BGI")
    for (i=0 i<n i++)
     
    if ((XY[i][0] >= Xmin) and
        (XY[i][0] <= Xmax))
     
        if ((XY[i][1] >= Ymin) and
            (XY[i][1] <= Ymax))
        putpixel(XY[i][0], XY[i][1], 3)
     
    *********************"""
    """*** Arithmetic view ***"""
    print("Point inside the viewing pane:")
    for i in range(n):
        if ((XY[i][0] >= Xmin) and
            (XY[i][0] <= Xmax)):
            if ((XY[i][1] >= Ymin) and
                (XY[i][1] <= Ymax)):
                print("[", XY[i][0], ", ", XY[i][1],
                      "]", sep = "", end = " ")
         
    # prpocoordinate outside viewing pane
    print("\n\nPoint outside the viewing pane:")
    for i in range(n):    
        if ((XY[i][0] < Xmin) or (XY[i][0] > Xmax)) :
            print("[", XY[i][0], ", ", XY[i][1],
                  "]", sep = "", end = " ")
        if ((XY[i][1] < Ymin) or (XY[i][1] > Ymax)) :
            print("[", XY[i][0], ", ", XY[i][1],
                  "]", sep = "", end = " ")
 
# Driver Code
if __name__ == '__main__':
    XY = [[10, 10], [-10, 10], [400, 100],
          [100, 400], [400, 400], [100, 40]]
 
    # getmaxx() & getmaxy() will return Xmax,
    # Ymax value if graphics.h is included
    Xmin = 0
    Xmax = 350
    Ymin = 0
    Ymax = 350
    pointClip(XY, 6, Xmin, Ymin, Xmax, Ymax)
 
# This code is contributed by
# SHUBHAMSINGH10

C#

// C# program for point clipping Algorithm
using System;
 
class GFG
{
 
// Function for point clipping
static void pointClip(int [,]XY, int n,
                        int Xmin, int Ymin,
                        int Xmax, int Ymax)
{
    /*************** Code for graphics view
    // initialize graphics mode
    detectgraph(&gm,&gr);
    initgraph(&gm,&gr,"d:\\tc\\BGI");
    for (int i=0; i<n; i++)
    {
    if ( (XY[i,0] >= Xmin) && (XY[i,0] <= Xmax))
    {
            if ( (XY[i,1] >= Ymin) && (XY[i,1] <= Ymax))
        putpixel(XY[i,0],XY[i,1],3);
    }
    }
    **********************/
    /**** Arithmetic view ****/
    Console.Write("Point inside the viewing pane:\n");
    for (int i = 0; i < n; i++)
    {
        if ((XY[i, 0] >= Xmin) && (XY[i, 0] <= Xmax))
        {
            if ((XY[i, 1] >= Ymin) && (XY[i, 1] <= Ymax))
                Console.Write("[{0}, {1}] ", XY[i, 0], XY[i, 1]);
        }
    }
 
    // print point coordinate outside viewing pane
    Console.Write("\nPoint outside the viewing pane:\n");
    for (int i = 0; i < n; i++)
    {
        if ((XY[i, 0] < Xmin) || (XY[i, 0] > Xmax))
            Console.Write("[{0}, {1}] ", XY[i, 0], XY[i, 1]);
        if ((XY[i, 1] < Ymin) || (XY[i, 1] > Ymax))
            Console.Write("[{0}, {1}] ", XY[i, 0], XY[i, 1]);
    }
}
 
// Driver code
public static void Main(String[] args)
{
        int [,]XY = {{10, 10}, {-10, 10}, {400, 100},
                    {100, 400}, {400, 400}, {100, 40}};
 
    // getmaxx() & getmaxy() will return Xmax, Ymax
    // value if graphics.h is included
    int Xmin = 0;
    int Xmax = 350;
    int Ymin = 0;
    int Ymax = 350;
    pointClip(XY, 6, Xmin, Ymin, Xmax, Ymax);
}
}
 
// This code contributed by Rajput-Ji

Producción: 
 

Point inside the viewing pane:
[10, 10] [100, 40] 

Point outside the viewing pane:
[-10, 10] [400, 100] [100, 400] [400, 400] [400, 400] 

Complejidad de tiempo: O(N)
Espacio auxiliar: O(1) 
Publicación relacionada: 
Recorte de línea | Conjunto 1 (algoritmo de Cohen-Sutherland)  
Recorte de polígonos | Algoritmo de Sutherland-Hodgman
Este artículo es una contribución de Shivam Pradhan (anuj_charm) . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *