裁剪用C语言,多边形裁剪
[c]代码库#include"conio.h"
#include"graphics.h"
#define right 1
#define bottom 2
#define left 3
#define top 4
#define N 20
void clip_polygon (int Xwmax,int Xwmin,int Ywmax,int Ywmin,int& n,int *x,int *y);
void clip_single_edge(int edge,int type,int& nin,int *xin,int *yin,int& nout,int *xout,int *yout);
void test_intersect(int edge,int type,int x1,int y1,int x2, int y2, int& xout,int& yout,int& yes,int& is_in);
void main()
{
int i;
int xwmax=400, xwmin=200,ywmax=400,ywmin=200,n=7;
int x[]={500,300,300,100,351,80,380};
int y[]={320,125,450,320,242,420,350};
initgraph(640,640);
setcolor(YELLOW);
rectangle(200,200,400,400);
outtextxy(200,20,"按回车键开始剪裁");
setcolor(RED);
for(i=0;i
{
moveto(x[i],y[i]);
if(i+1!=n)
lineto(x[i+1],y[i+1]);
else lineto(x[0],y[0]);
}
getch();
cleardevice();
setcolor(YELLOW);
rectangle(200,200,400,400);
clip_polygon(xwmax,xwmin,ywmax,ywmin,n,x,y);
getch();
closegraph();
}
void clip_polygon (int Xwmax,int Xwmin,int Ywmax,int Ywmin,int& n,int *x,int *y)
{ int x1[N],y1[N],x2[N],y2[N],n1;
clip_single_edge(Xwmax,right,n,x,y,n1,x1,y1);
clip_single_edge(Ywmax,bottom,n1,x1,y1,n1,x2,y2);
clip_single_edge(Xwmin,left,n1,x2,y2,n1,x1,y1);
clip_single_edge(Ywmin,top,n1,x1,y1,n1,x2,y2);
setcolor(GREEN);
for(int i=0;i
{
moveto(x2[i],y2[i]);
if(i+1!=n1)
lineto(x2[i+1],y2[i+1]);
else lineto(x2[0],y2[0]);
}
}
void clip_single_edge(int edge,int type,int& nin,int *xin,int *yin,int& nout,int *xout,int *yout)
{
int k=0, yes, is_in;
int x, y, x_intersect, y_intersect;
x=xin[nin-1];y=yin[nin-1];
for(int j=0; j
{
test_intersect(edge, type, x, y,xin[j], yin[j],x_intersect,y_intersect,yes,is_in);
if(yes)
{
xout[k]=x_intersect;
yout[k]=y_intersect;
k++;
}
if(is_in)
{
xout[k]=xin[j];
yout[k]=yin[j];
k++;
}
x=xin[j];
y=yin[j];
}
nout=k;
}
void test_intersect(int edge,int type,int x1,int y1,int x2, int y2, int& xout,int& yout,int& yes,int& is_in)
{
float m;
is_in=yes=0;
if(x1!=x2)
m=(float)((float)y2-(float)y1)/((float)x2-(float)x1);
switch(type)
{
case right :
if (x2
{
is_in=1;
if(x1>edge)
yes=1;
}
else
if(x1<=edge)
yes=1;
break;
case bottom:
if(y2<=edge)
{
is_in=1;
if(y1>edge)
yes=1;
}
else
if(y1<=edge)
yes=1;
break;
case left:
if(x2>=edge)
{
is_in=1;
if(x1
yes=1;
}
else
if(x1>=edge)
yes=1;
break;
case top :
if(y2>=edge)
{
is_in=1;
if(y1
yes=1;
}
else
if(y1>=edge)
yes=1;
default: break;
}
if(yes)
if((type==right) || (type==left))
{
xout = edge;
yout=(y1+m*(xout-x1));
}
else
if(x1==x2)
{
if(type==2&&(y1<=edge||y2<=edge))
{xout=x1;yout=edge;}
if(type==4&&(y1>=edge||y2>=edge))
{xout=x1;yout=edge;}
}
else
{
yout=edge; xout=x1+(yout-y1)/m;
}
}
裁剪用C语言,多边形裁剪相关推荐
- 中点分割裁剪算法 c语言,裁剪算法——中点分割算法/Liang-Barsky算法
三.中点分割法 首先对直线段的端点进行编码. [核心思想:通过二分逼近来确定直线段与窗口的交点.] 具体方法: 1.若中点不在窗口内,则把[中点]和离窗口边界[最远点]构成的线段丢掉,以线段上的另一点 ...
- 计算机图形学11:二维观察之多边形的裁剪
作者:非妃是公主 专栏:<计算机图形学> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文章目录 专栏推 ...
- 计算机图形学和工程图学,计算机图形学与印刷工程我与工程图学及计算机图形学...
一.我与浙大工程图学一同发展 我国工程图学课程量大面广,从新中国成立以来主要承袭于前苏联,经过50多年的建设.改革和发展,课程体系形成了较明显的中国特色,既不同于欧美,也不同于前苏联.可以分为如下四个 ...
- 人工智能专业基础课程
计算机系统基础(一):程序的表示.转换与链接 课程大纲 01 第一周 计算机系统概述 课时 第1讲 为什么要学习计算机系统基础 第2讲 计算机系统基本组成与基本功能 ...
- modis数据介绍_【更新90篇】地理数据科学技术文章合集,欢迎大家点赞、在看、转发三连!...
最近因微信公众号修改了规则, 不将公众号标星可能无法及时收到推送, 还请大家把"走天涯徐小洋地理数据科学"加个星标. 公众号技术文章合集目录,目前已整理以下8个部分,共计90篇文章 ...
- 计算机图形学规则形体,计算机图形学教案
3. 配对 4. 填色 扫描线基础算法的核心是计算扫描线与多边形的交点,然后配对,着色.其实求解交点这一步工作量是非常大的,所以根据前面介绍的多边形边的连贯性,区域的连贯性规则,我们可以构造更简单的扫 ...
- WorldWind软件在VxWorks下的移植
WorldWind软件在VxWorks下的移植 3162412793@qq.com 技术交流QQ群: 691976956 1 WorldWind软件概述 NASA就是我们所熟知的美国航天宇航局,在美国 ...
- 天正的计算机快捷命令大全,天正建筑快捷键命令大全
天正建筑快捷键命令大全 天正建筑命令快捷键大全一天正建筑命令快捷键大全一轴网菜单轴网菜单重排轴号改变图中一组轴线编号,该组编号自动进行重新排序倒排轴号倒排轴线编号,适用于特定方向的立剖面轴线绘制单轴变 ...
- 基于PythonGUI的图形学系统绘图软件
目录 一. 综述 1 完成的内容(额外功能为加粗部分) 1 二. 算法介绍 3 DDA 3 bresenham 4 3.中点椭圆 5 4.bezier 绘制曲线 6 5.B-Spline 绘制曲线 7 ...
- 计算机图形学 学习笔记(五):多边形裁剪(Suther land-Hodgeman),文字裁剪
接上文 计算机图形学 学习笔记(四):直线裁剪算法:Cohen-Suther land,中点分割法,Liang-Barsky 光栅图形学算法 3.4 多边形裁剪 之前上一篇文章中,我们介绍了直线段的裁 ...
最新文章
- juc java_深入理解JUC(java.util.concurrent)
- 【IM】关于参数模型和核模型的理解
- Java实现仿百度文库文档在线阅读
- 【Docker】 安装 mysql
- 完全背包问题从简单到复杂
- mysql 5.5 主从同步_Windows下mysql5.5主从同步
- kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用
- py哪个函数可以返回输入的变量类型_[Python基础]二、pycharm,python变量
- collections的defaultdict使用
- ARM中的RO、RW和ZI DATA说明
- 10月10日,可为程序员节日
- 【高数】高数第八章节——向量代数与空间解析几何空间直角坐标系
- 服务器抓取MIUI ota信息,官方科普|关于MIUI系统OTA
- 你需要来自trustedinstaller的权限才能删除
- C语言运行时电脑白屏怎么办,win10电脑白屏死机无响怎么回事_win10电脑白屏死机无响七种解决方法...
- NBIOT模组M5310接入OneNET平台
- SOA只不过是一种设计模式而已
- python 开源cms内容管理系统_30 个很棒的 PHP 开源 CMS 内容管理系统
- 组播Lab RPF TTL
- 在音乐世界中的感悟:人生,朋友和音乐
热门文章
- m05_Extract Feature_Transformers(慎variances_)_download Adult互联网ads数据集_null value(?_csv_SVD_PCA_eigen
- python 因子分析 权重计算方法_如何使用Python(scikit-learn)计算FactorAnalysis得分?
- 杭州电子科技大学acm---2007
- 笔记本计算机管理没有键盘,如何禁用笔记本键盘输入?怎么关闭笔记本键盘
- BZOJ 3097: Hash Killer I【构造题,思维题】
- java在regedit找不到_Windows找不到文件regedit打不开注册表的解决办法
- python画三维投影图_python之画三维图像
- android自定义大转盘,Android使用surfaceView自定义抽奖大转盘
- ChinaVis 2017
- VBA编程_Selection总结