#include<stdio.h>
#include<graphics.h>
void initgr(void)
{
int gd = DETECT, gm = 0;
initgraph(&gd, &gm, "");
}
int encode(int x,int y,int code[],int xw_min,int xw_max,int yw_min,int yw_max)//编码
{
int i;
for(i=0;i<4;i++)
code[i]=0;
if(x<xw_min)
code[0]=1;
else if(x>xw_max)
code[1]=1;
if(y>yw_max)
code[3]=1;
else if(y<yw_min)
code[2]=1;
return(0);
}
int accept(int code1[],int code2[]) //判断是否都在裁剪区间内
{
int i,flag;
flag=1;
for(i=0;i<4;i++){
if((code1[i]==1) || (code2[i]==1)){
flag=0;
break;
}
}
return(flag);
}
int reject(int code1[],int code2[])//简弃
{
int i,flag;
flag=0;
for(i=0;i<4;i++){
if((code1[i]==1) && (code2[i]==1)){
flag=1;
break;
}
}
return(flag);
}
int swap_if_needed(int code1[],int code2[])//确保1在内 2在外
{
int i,flag1,flag2,tmp;
flag1=1;
for(i=0;i<4;i++)
if(code1[i]==1){
flag1=0;
break;
}
flag2=1;
for(i=0;i<4;i++)
if(code2[i]==1){
flag2=0;
break;
}
if((flag1==0) && (flag2==0))
return(0);
if((flag1==1) && (flag2==0)){
for(i=0;i<4;i++){
tmp=code1[i];
code1[i]=code2[i];
code2[i]=tmp;
}
return(1);
}
return(0);
}
void clip_a_line(int x1,int y1,int x2,int y2,int xw_min,int xw_max,int yw_min,int yw_max)
{
int i,code1[4],code2[4],done,display;
float m;
int x11,x22,y11,y22,mark;
done=0;
display=0;
while(done==0){
x11=x1;
x22=x2;
y11=y1;
y22=y2;
encode(x1,y1,code1,xw_min,xw_max,yw_min,yw_max);
encode(x2,y2,code2,xw_min,xw_max,yw_min,yw_max);
if(accept(code1,code2)){
done=1;
display=1;
break;
}
else if(reject(code1,code2)){
done=1;
break;
}
mark=swap_if_needed(code1,code2);//点12是否交换了顺序
if(mark==1){
x1=x22;
x2=x11;
y1=y22;
y2=y11;
}
if(x2==x1)//斜率∞
m=-1;
else
m=(float)(y2-y1)/(float)(x2-x1);
if(code1[2]){
x1+=(yw_min-y1)/m;
y1=yw_min;
}
else if(code1[3]){
x1-=(y1-yw_max)/m;
y1=yw_max;
}
else if(code1[0]){
y1-=(x1-xw_min)*m;
x1=xw_min;
}
else if(code1[1]){
y1+=(xw_max-x1)*m;
x1=xw_max;
}
}
if(display==1)
line(x1,y1,x2,y2);
}
int main()
{
int x1=50,x2=400,y1=50,y2=350,xw_min=100,xw_max=300,yw_min=100,yw_max=300;
initgr();
setcolor(GREEN);
line(xw_min,yw_min,xw_max,yw_min);
line(xw_min,yw_max,xw_max,yw_max);
line(xw_min,yw_min,xw_min,yw_max);
line(xw_max,yw_min,xw_max,yw_max);
getch();
setcolor(YELLOW);
line(x1,y1,x2,y2);
getch();
cleardevice();
setcolor(GREEN);
line(xw_min,yw_min,xw_max,yw_min);
line(xw_min,yw_max,xw_max,yw_max);
line(xw_min,yw_min,xw_min,yw_max);
line(xw_max,yw_min,xw_max,yw_max);
setcolor(RED);
clip_a_line(x1,y1,x2,y2,xw_min,xw_max,yw_min,yw_max);
getch();
closegraph();
}
计算机图形学实验 C语言 EGE实现
需积分: 50 167 浏览量
2017-12-09
15:03:01
上传
评论 3
收藏 2.09MB RAR 举报
zhangyuygss
- 粉丝: 1
- 资源: 2
最新资源
- 基于Java的银行客户及用户管理系统设计源码
- 免费Ollama 官方大模型服务器安装程序
- 【个人博客搭建】(5)Sqlsugar实体创建数据库数据 生成时打印的SQL语句,也可用他创建
- 基于Scrapy和Redis的分布式爬虫设计源码
- 纯HTML外贸公司通用企业html网站模板源码
- 基于Flask轻量级Web框架的Aliexpress项目设计源码
- Java毕设之ssm-079-mysql-ssm软件bug管理系统-.rar
- 基于Vue和TypeScript的移动端潮玩商城设计源码
- Java毕设之ssm-067-mysql-网约车用户服务平台-.rar
- 基于Kotlin和Java的安卓计算器应用设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈