Seguici su Telegram, ne vale la pena ❤️ ➡ @trovalost
Vai al contenuto

Computer grafica: come riempire un poligono

L’algoritmo di riempimento del poligono è una tecnica potente per colorare poligoni su un piano cartesiano. Identificando e ordinando accuratamente le intersezioni dei lati del poligono con le scanline orizzontali, possiamo ottenere un riempimento preciso e accurato del poligono, che è fondamentale in molte applicazioni grafiche.

Ecco una spiegazione passo passo dell’algoritmo di riempimento del poligono. L’algoritmo di riempimento del poligono è utilizzato per colorare un poligono su un piano cartesiano. L’obiettivo è individuare quali parti dello spazio interno del poligono devono essere colorate.

Passo 1: Definizione dei Vertici del Poligono

Prima di tutto, dobbiamo definire i vertici del poligono. Ogni vertice è rappresentato da una coppia di coordinate (x, y) che indicano la sua posizione sul piano cartesiano.

Passo 2: Identificazione delle Intersezioni

Per riempire il poligono, dobbiamo identificare dove i lati del poligono intersecano le “scanline” orizzontali, ovvero le linee parallele all’asse x che attraversano verticalmente il poligono.

Passo 3: Calcolo delle Intersezioni

Per ogni scanline, calcoliamo le intersezioni con i lati del poligono. Per fare ciò, confrontiamo le coordinate y dei vertici del poligono con l’altezza della scanline. Se un lato del poligono attraversa la scanline, calcoliamo la coordinata x dell’intersezione utilizzando l’equazione della retta che collega i due vertici del lato.

Passo 4: Ordinamento delle Intersezioni

Una volta identificate tutte le intersezioni per una data scanline, le ordiniamo in base alle loro coordinate x crescenti. Questo è fondamentale per garantire che le intersezioni siano connesse correttamente durante il riempimento del poligono.

Passo 5: Riempimento del Poligono

Utilizzando le intersezioni ordinate, riempiamo il poligono colorando le aree comprese tra le intersezioni su ciascuna scanline. Questo processo continua fino a quando non abbiamo considerato tutte le scanline necessarie per coprire l’intero poligono.

Il codice

(sorgente qui)

In breve, questo codice utilizza Tkinter per creare una finestra grafica e disegnare un poligono all’interno di essa, utilizzando l’algoritmo Bubble Sort per ordinare le intersezioni dei lati del poligono con le scanline verticali. Nel dettaglio si utilizza la libreria Tkinter per creare una finestra grafica e disegnare un poligono all’interno di essa. L’algoritmo Bubble Sort viene utilizzato per ordinare le intersezioni dei lati del poligono con le scanline verticali. Di seguito una spiegazione dettagliata del codice:

  1. Importazione di Tkinter:
  • import tkinter as tk

    Tkinter è una libreria di Python utilizzata per creare applicazioni grafiche.

  • Funzione per disegnare un poligono:
  • def draw_polygon(canvas, vertices):
    canvas.create_polygon(vertices, outline='black', fill='')

    Questa funzione prende in input un canvas Tkinter e una lista di vertici del poligono e disegna il poligono utilizzando il metodo create_polygon.

  • Funzione Bubble Sort per ordinare le intersezioni lungo l’asse x:
  • def bubble_sort(canvas, intersections):
    n = len(intersections)
    for i in range(n):
    for j in range(0, n-i-1):
    if intersections[j][0] > intersections[j+1][0]:
    intersections[j], intersections[j+1] = intersections[j+1], intersections[j]
    # Disegna il testo "Bubble Sort" nel canvas
    canvas.create_text(15, 15, anchor="nw", text="Riempire un poligono con Bubble Sort", fill="blue")
    canvas.update()

    Questa funzione esegue l’algoritmo Bubble Sort sulla lista di intersezioni in modo da ordinare le intersezioni lungo l’asse x. Durante ogni scambio, disegna il testo “Riempire un poligono con Bubble Sort” nel canvas Tkinter.

  • Funzione per riempire il poligono:
  • def fill_polygon(canvas, vertices, delay=1):
    # Calcolo del range verticale del poligono
    min_y = min(vertices, key=lambda vertex: vertex[1])[1]
    max_y = max(vertices, key=lambda vertex: vertex[1])[1]
    # Disegno del poligono
    draw_polygon(canvas, vertices)# Iterazione attraverso le scanline verticali
    for y in range(min_y, max_y + 1):
    # Lista per memorizzare le intersezioni con la scanline
    intersections = []

    # Iterazione attraverso i lati del poligono
    for i in range(len(vertices)):
    p1 = vertices[i]
    p2 = vertices[(i + 1) % len(vertices)]

    # Controllo se il lato attraversa la scanline corrente
    if p1[1] < y <= p2[1] or p2[1] < y <= p1[1]:
    # Calcolo della coordinata x dell’intersezione con la scanline
    x_intersection = p1[0] + (y – p1[1]) * (p2[0] – p1[0]) / (p2[1] – p1[1])
    # Aggiunta dell’intersezione come coppia (x, y) alla lista
    intersections.append((x_intersection, y))

    # Ordinamento delle intersezioni lungo l’asse x utilizzando Bubble Sort
    bubble_sort(canvas, intersections)

    # Disegno delle linee orizzontali tra le intersezioni
    for i in range(0, len(intersections), 2):
    x_start = int(intersections[i][0])
    x_end = int(intersections[i + 1][0])

    # Disegno della linea orizzontale sul canvas
    for x in range(x_start, x_end + 1):
    canvas.create_rectangle(x, y, x+1, y+1, outline=, fill=‘black’)
    canvas.update()
    canvas.after(delay)

    Questa funzione riempie il poligono disegnato precedentemente. Itera attraverso le scanline verticali, calcola le intersezioni dei lati del poligono con ciascuna scanline e ordina le intersezioni lungo l’asse x utilizzando l’algoritmo Bubble Sort. Infine, disegna le linee orizzontali tra le intersezioni per riempire il poligono.

  • Creazione della finestra e del canvas:
  • root = tk.Tk()
    canvas = tk.Canvas(root, width=400, height=400)
    canvas.pack()

    Questo codice crea una finestra Tkinter e un canvas all’interno di essa.

  • Definizione dei vertici del poligono e riempimento del poligono:
  • vertices = [(50, 50), (200, 100), (150, 200), (100, 150)]
    fill_polygon(canvas, vertices)

    Viene definita una lista di vertici del poligono e la funzione fill_polygon viene chiamata per riempire il poligono nel canvas.

  • Esecuzione del loop di eventi Tkinter:
root.mainloop()

Questo codice avvia il loop di eventi Tkinter, che gestisce gli eventi grafici e mantiene aperta la finestra finché non viene chiusa dall’utente.

👇 Da non perdere 👇



Questo portale esiste da 4520 giorni (12 anni), e contiene ad oggi 4038 articoli (circa 3.230.400 parole in tutto) e 16 servizi online gratuiti. – Leggi un altro articolo a caso
Non ha ancora votato nessuno.

Ti sembra utile o interessante? Vota e fammelo sapere.

Questo sito contribuisce alla audience di sè stesso.
Il nostro network informativo: Lipercubo - Pagare online (il blog) - Trovalost.it