Алгоритм отсечения точек в компьютерной графике

Опубликовано: 19 Января, 2022

Отсечение: в компьютерной графике наш экран действует как двумерная система координат. не обязательно, чтобы каждая точка была видна на нашей панели просмотра (то есть на экране нашего компьютера). Мы можем просматривать точки, которые лежат в определенном диапазоне (0,0) и (Xmax, Ymax). Итак, отсечение - это процедура, которая идентифицирует те части изображения, которые находятся либо внутри, либо за пределами нашей области просмотра.
В случае отсечения точек мы показываем / печатаем только те точки в нашем окне, которые находятся в диапазоне нашей области просмотра, другие точки, которые находятся за пределами диапазона, отбрасываются.
Пример

Вход :
 
Выход :

Алгоритм отсечения точки:

  1. Получите минимальные и максимальные координаты обеих панелей просмотра.
  2. Получите координаты точки.
  3. Проверьте, находится ли данный ввод между минимальной и максимальной координатой области просмотра.
  4. Если да, отобразите точку, которая находится внутри области, в противном случае отбросьте ее.

Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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<<" "<< 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: ");
    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 (" Point outside the viewing pane: ");
    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: ");
    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 (" Point outside the viewing pane: ");
    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 poclipping Algorithm
  
# Function for poclipping 
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(" Point 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: ");
    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(" Point outside the viewing pane: ");
    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

Выход:

Наведите курсор на панель просмотра:
[10, 10] [100, 40] 

Точка за пределами области просмотра:
[-10, 10] [400, 100] [100, 400] [400, 400] [400, 400] 

Связанный пост:
Обрезка линии | Набор 1 (алгоритм Коэна – Сазерленда)
Обрезка многоугольника | Алгоритм Сазерленда – Ходжмана

Автор статьи - Шивам Прадхан (anuj_charm) . Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью на сайте deposit.geeksforgeeks.org или отправить свою статью по электронной почте: grant@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .

Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.