利用油画家算法实现隐藏面的消除。设有四个平面,在屏幕上显示这四个平面,使前面的平面覆盖后面的平面。
#include<math.h>
#include<stdlib.h>
#include<iostream>
#include<graphics.h>
#include<stdio.h>
#include<conio.h>
using namespace std;
int a[4],b[4],i;
void initial() {
cout<<"请分别输入圆形,三角形,椭圆形,矩形的Z值:";
for(i=0; i<4; i++) {
cin>>a[i];
b[i] = a[i];//a[i]和b[i]都存入四种图形的Z值
}
//冒泡排序,将深度值按递增排序,方便下面进行油画家算法的比较
for(i=0; i<4; i++)
for(int j=i+1; j<4; j++)
if(a[i] > a[j]) {
int temp = 0;
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
for(i=0; i<4; i++)
cout<<a[i]<<endl;
}
//a[i]中已经是排好序,b[i]中是初值,这时候按照a[i]中的顺序依次画出图形,后画的会自动将先画的部分遮住,由此便实现了消隐效果。
void paint() {
for(i=0; i<4; i++) {
if(a[i] == b[0]) {//画圆
setfillcolor(BLACK);
fillcircle(400,300,100);
}
if(a[i] == b[1]) {//画三角形
POINT pts[] = { {50, 200}, {400, 400}, {300, 150} };
setfillcolor(RED);
fillpolygon(pts, 3);
}
if(a[i] == b[2]) {//画椭圆
setfillcolor(BLUE);
fillellipse(10,200,300,300);
}
if(a[i] == b[3]) {//画矩形
setfillcolor(GREEN);
fillrectangle(100,100,200,200);
}
}
}
void main() {
initial();
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
setbkcolor(WHITE);
cleardevice();
paint();
getchar();
getchar();
closegraph();
}