Write a C program to fill a polygon using Scan Line fill algorithm.
Below is a C program that implements the Scan Line Fill Algorithm to fill a polygon.
The Scan Line Fill Algorithm is used to fill the interior of a polygon. The idea is to scan the polygon horizontally from top to bottom and determine which parts of the polygon need to be filled for each scan line.
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#define MAX_VERTICES 20
// Structure to store the edges
struct Edge {
int x; // X coordinate of the intersection
float slope; // Slope of the edge
};
// Function to sort the edges by their X-coordinate
void sortEdges(struct Edge edges[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (edges[j].x > edges[j + 1].x) {
struct Edge temp = edges[j];
edges[j] = edges[j + 1];
edges[j + 1] = temp;
}
}
}
}
// Function to fill a polygon using the Scan Line Fill algorithm
void scanLineFill(int polygon[][2], int n) {
int y_min = polygon[0][1], y_max = polygon[0][1];
// Find the min and max y-coordinates of the polygon
for (int i = 1; i < n; i++) {
if (polygon[i][1] < y_min)
y_min = polygon[i][1];
if (polygon[i][1] > y_max)
y_max = polygon[i][1];
}
// Loop through every scan line from y_min to y_max
for (int y = y_min; y <= y_max; y++) {
struct Edge edges[MAX_VERTICES];
int edge_count = 0;
// Find the intersections of the scan line with the edges of the polygon
for (int i = 0; i < n; i++) {
int x1 = polygon[i][0], y1 = polygon[i][1];
int x2 = polygon[(i + 1) % n][0], y2 = polygon[(i + 1) % n][1];
// Check if the scan line intersects this edge
if ((y1 <= y && y2 > y) || (y2 <= y && y1 > y)) {
// Calculate the x-coordinate of the intersection
int x_intersection = x1 + (y - y1) * (x2 - x1) / (y2 - y1);
edges[edge_count].x = x_intersection;
edges[edge_count].slope = (float)(x2 - x1) / (y2 - y1);
edge_count++;
}
}
// Sort the edges by their x-coordinate
sortEdges(edges, edge_count);
// Fill the pixels between pairs of intersections
for (int i = 0; i < edge_count; i += 2) {
for (int x = edges[i].x; x <= edges[i + 1].x; x++) {
putpixel(x, y, WHITE);
}
}
}
}
int main() {
int gd = DETECT, gm;
initgraph(&gd, &gm, ""); // Initialize graphics mode
int n;
printf("Enter the number of vertices of the polygon: ");
scanf("%d", &n);
int polygon[n][2];
printf("Enter the coordinates of the vertices (x, y):\n");
for (int i = 0; i < n; i++) {
printf("Vertex %d: ", i + 1);
scanf("%d %d", &polygon[i][0], &polygon[i][1]);
}
// Draw the polygon outline
for (int i = 0; i < n; i++) {
line(polygon[i][0], polygon[i][1], polygon[(i + 1) % n][0], polygon[(i + 1) % n][1]);
}
// Call the scan line fill algorithm
scanLineFill(polygon, n);
// Wait for the user to press a key before closing the graphics window
getch();
closegraph();
return 0;
}