Scan line Algorithm
- The scan line algorithm is an alternative to the seed fill algorithm.
- It does not require scan conversion of the edges before filling the polygons
- It can be applied simultaneously to a set of polygons rather than filling each polygon individually.
Algorithm for Scan line C++ code-
Step1: Start algorithm
Step2: Initialize the desired data structure
- Create a polygon table having color, edge pointers, coefficients
- Establish edge table contains information regarding, the endpoint of edges, pointer to polygon, inverse slope.
- Create Active edge list. This will be sorted in increasing order of x.
- Create a flag F. It will have two values either on or off.
Step3: Perform the following steps for all scan lines
- Enter values in Active edge list (AEL) in sorted order using y as value
- Scan until the flag, i.e. F is on using a background color
- When one polygon flag is on, and this is for surface S1enter color intensity as I1into refresh buffer
- When two or image surface flag are on, sort the surfaces according to depth and use intensity value Sn for the nth surface. This surface will have least z depth value
- Use the concept of coherence for remaining planes.
Step4: Stop Algorithm
Scan line algorithm c++ code -
#include<bits/stdc++.h>
#include<graphics.h>
using namespace std;
int main()
{
int n,x[10],y[10],k=0,ymin=1000000,ymax=0,Y,dx,dy,xi[100],gm,gd,temp;
float slope[100];
printf("Enter the number of vertices:");
scanf("%d",&n);
printf("enter the coordinates of vertices:");
for(int i=0;i<n;i++)
{
scanf("%d%d",&x[i],&y[i]);
if(y[i]>ymax)
ymax=y[i];
if(y[i]<ymin)
ymin=y[i];
}
detectgraph(&gd,&gm);
initgraph(&gd,&gm," ");
x[n]=x[0];y[n]=y[0];
//draw polygon using all the edges
for(int i=0;i<n;i++)
{
line(x[i],y[i],x[i+1],y[i+1]);
}
//
for(int i=0;i<n;i++)
{
dx=x[i+1]-x[i];
dy=y[i+1]-y[i];
if(dy==0)slope[i]=1.0;
if(dx==0)slope[i]=0.0;
if(dx!=0 && dy!=0)
slope[i]=(float)dx/dy;
}
for(int j=0;j<=ymax;j++)
{
int k=0;
for(int i=0;i<n;i++){
if(((y[i]<=j) && (y[i+1]>j)) || ((y[i]>j) && (y[i+1]<=j))){
xi[k]=(int)(x[i]+slope[i]*(j-y[i]));
k++;
}
}
for(int m=0;m<k-1;m++){
for(int i=0;i<k-1;i++){
if(xi[i]>xi[i+1]){
temp=xi[i];
xi[i]=xi[i+1];
xi[i+1]=temp;
}
}
setcolor(2);
for(int i=0;i<k;i+=2){
line(xi[i],j,xi[i+1]+1,j);delay(100);
}
}
}
return 0;
}
OUTPUT-
Enter the number of vertices: 5
enter the coordinates of vertices:
30 30
30 150
120 60
120 120
210 30
Comments
Post a Comment