热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

裁剪算法c语言,弦截法c语言

本文目录一览:1、利用编码的方法进行二维裁剪时有哪些判断规则

本文目录一览:


  • 1、利用编码的方法进行二维裁剪时有哪些判断规则


  • 2、求一个多边形的裁剪算法


  • 3、学好计算机图形学需要学习那些相关的知识?


  • 4、如果要用Liang-Barskey算法实现裁剪,如何修改程序?


  • 5、裁剪算法

利用编码的方法进行二维裁剪时有哪些判断规则

要利用编码制作和裁剪出不规则的图形,具体步骤如下:

第一、启动ps软件,进入ps的界面后,将特定的图片拖进去;

第二。打开图片之后,双击该背景图层右边的锁头图标,在“新建图层”窗口上点击“确定”;

第三、图片解锁之后,使用钢笔工具在图片上方画出一个不规则的图形;

第四、接着在左侧工具栏里点击使用“路径选择工具”;

第五、接着,在图片上右击鼠标,选择“创建矢量蒙版”;

第六然后就可以看到该图片被裁剪成不规则的图形了。

求一个多边形的裁剪算法

#include graphics.h

#include dos.h

union REGS i,o;

int xl=100,xr=540,yb=400,yt=200; /*方框边界*/

void init()

{

int driver=DETECT,gm;

initgraph(driver,gm,"");

printf("Instruction:\n");

printf("1.Press left mouse button to set the vertex;\n");

printf("2.Press right button to end drawing;\n");

/*printf("3.Press both button to clip.");*/

outtextxy(450, 440, "Edit by lcfhy!");

setwritemode(2);

line(0,70,639,70);

setcolor(YELLOW);

rectangle(xl,yt,xr,yb);

i.x.ax=0;

int86(0x33,i,o);

if(o.x.ax==0)

{

printf("Mouse is not available...");

getch();

exit();

}

i.x.ax=1;

int86(0x33,i,o);

/*设置光标可用范围(Y方向)*/

i.x.ax=8;

i.x.cx=71;

i.x.dx=479;

int86(0x33,i,o);

}

int mousestatus(int *x,int *y)

{

i.x.ax=3; /*查询鼠标状态功能号为03H*/

int86(0x33,i,o);

*x=o.x.cx; /*鼠标横坐标 */

*y=o.x.dx; /*鼠标纵坐标 */

return o.x.bx; /*返回按键情况:0-NONE,1-LEFT,2-RIGHT,3-BOTH; */

}

void endpro() /*结束裁剪*/

{

char s[50]="Press any key to exit...";

setcolor(WHITE);

outtextxy(200,120,s); /*此处有可能出现乱码,正常现象,出现概率随机*/

getch();

closegraph();

exit();

}

void code(int x,int y,int *c )

{/*c为5元数组*/

int i;

for(i=1;i=4;i++) c[i]=0;

if(xxl) c[4]=1;

if(xxr) c[3]=1;

if(yyt) c[1]=1;

if(yyb) c[2]=1;

}

void cut(int x1,int y1,int x2,int y2)/*把不需要的线置为黑色,不可见*/

{

setcolor(BLACK);

setlinestyle(0, 0, 3); /*设置三点宽实线*/

line(x1,y1,x2,y2);

}

int logic_ride(int *c1,int *c2)/*判断逻辑乘是否为0,是则返回0,否则返回1*/

{

int i;

for(i=1;i=4;i++)

{

if(c1[i]*c2[i]==1) return 1;

}

return 0;

}

int logic2_ride(int *c)/*在内部则返回1,否则返回0*/

{

int m;

for(m=0;m=4;m++)

if(c[m]==1) return 0;

return 1;

}

void clip(int *x,int *y,int k)

/*裁剪函数,如果某个线段不在可视区,我们将其颜色置为黑色,否则不作颜色改变*/

{

/*int i;

for(i=1;i=k;i++)

printf("%d,%d\n",x[i],y[i]);*/ /*此段代码检测模板存入的数据没错*/

int c1[5],c2[5],c[5],p,x0,y0,ultra_x,ultra_y,t;/*x0,y0储存临时交点*/

x[k+1]=x[1];y[k+1]=y[1];

for(p=1;p=k;p++)

{

code(x[p],y[p],c1);

code(x[p+1],y[p+1],c2);

if(logic_ride(c1,c2)) cut(x[p],y[p],x[p+1],y[p+1]);/*完全不可见,则完全剪除*/

else if(logic2_ride(c1)==1logic2_ride(c2)==1) ;/*排除一种情况*/

else /*不完全在里面,也不完全在外面*/

{

if(logic2_ride(c1)!=1)/*起点在外面*/

{

t=1;

while(t)

{

if(logic_ride(c,c2)) {cut(x[p],y[p],x[p+1],y[p+1]);break;}/*完全不可见,则完全剪除*/

else

{

if(c1[4]==1)/*判断四边的情况*/

{

x0=xl;

y0=y[p]+(y[p+1]-y[p])*(xl-x[p])/(x[p+1]-x[p]);

}

else if(c1[3]==1)

{

x0=xr;

y0=y[p]+(y[p+1]-y[p])*(xr-x[p])/(x[p+1]-x[p]);

}

else if(c1[1]==1)

{

y0=yt;

x0=x[p]+(x[p+1]-x[p])*(yt-y[p])/(y[p+1]-y[p]);

}

else if(c1[2]==1)

{

y0=yb;

x0=x[p]+(x[p+1]-x[p])*(yb-y[p])/(y[p+1]-y[p]);

}

cut(x[p],y[p],x0,y0);

x[p]=x0;y[p]=y0; code(x0,y0,c);

if(logic2_ride(c)==1) t=0;

}

}

}

if(logic2_ride(c2)!=1)/*终点在外面*/

{

t=1;

if(c2[4]==1)/*判断四边的情况*/

{

x0=xl;

y0=y[p]+(y[p+1]-y[p])*(xl-x[p])/(x[p+1]-x[p]);

}

else if(c2[3]==1)

{

x0=xr;

y0=y[p]+(y[p+1]-y[p])*(xr-x[p])/(x[p+1]-x[p]);

}

else if(c2[1]==1)

{

y0=yt; x0=x[p]+(x[p+1]-x[p])*(yt-y[p])/(y[p+1]-y[p]);

}

else if(c2[2]==1)

{

y0=yb; x0=x[p]+(x[p+1]-x[p])*(yb-y[p])/(y[p+1]-y[p]);

}

cut(x0,y0,x[p+1],y[p+1]);

code(x0,y0,c);

if(logic2_ride(c)==0)

{

if(c[4]==1)/*判断四边的情况*/

{

ultra_x=xl;

ultra_y=y0+(y[p+1]-y0)*(xl-x0)/(x[p+1]-x0);

}

else if(c[3]==1)

{

ultra_x=xr;

ultra_y=y0+(y[p+1]-0)*(xr-0)/(x[p+1]-x0);

}

else if(c[1]==1)

{

ultra_y=yt;

ultra_x=x0+(x[p+1]-x0)*(yt-y0)/(y[p+1]-y0);

}

else if(c[2]==1)

{

ultra_y=yb;

ultra_x=x0+(x[p+1]-x0)*(yb-y0)/(y[p+1]-y0);

}

cut(x0,y0,ultra_x,ultra_y);

}

}

}

}

endpro();

}

void draw(int *x,int *y)

{

int k=0,lx,ly,color,i;

int tempx,tempy;

while(1){

/*描点并存储顶点*/

if(mousestatus(tempx,tempy)==1)

{

if(x[k]!=tempx||y[k]!=tempy) k++; /*这一步有关键,想想看为什么?*/

x[k]=tempx;

y[k]=tempy;

setcolor(WHITE);

circle(tempx,tempy,1);

if (k!=1)

{

setcolor(WHITE);

line(x[k-1],y[k-1],x[k],y[k]);

}

}

lx=tempx,ly=tempy;

if(mousestatus(tempx,tempy)==2) /*如果按下右键*/

{

line(x[1],y[1],x[k],y[k]);

clip(x,y,k);

}

putpixel(tempx,tempy,WHITE);/* trace the mouse,*/

putpixel(lx,ly,BLACK);

}

}

void main()

{

int x[100],y[100];

init();

draw(x,y);

}

来源:

学好计算机图形学需要学习那些相关的知识?

学好计算机图形学主要学好线形代数和高等数学这二门课。

主要的还是一些图形学的算法研究,当然c语言也是必不可少的。

计算机图形学介绍了很多基础算法,这些算法虽然很基础,但是很经典,关键是学到一种思考问题的方式。

如果要用Liang-Barskey算法实现裁剪,如何修改程序?

给你一个完整的Liang-Barskey直线段裁剪算法的C语言程序

#include "graphics.h"

#include "stdio.h"

#define LINE_COLOR 10

#define WINDOW_COLOR 4

int ClipT(float p,float q,float *u1,float *u2)

{

int flag=1;

float r;

if(p0.0)

{

r=q/p;

if(r*u2) flag=0;

else if(r*u1)

*u1=r;

}

else if(p0.0)

{

r=q/p;

if(r*u1) flag=0;

else if(r*u2)

*u2=r;

}

else if(q0.0) flag=0;

return flag;

}

void Liang_Barsky(int xL,int yT,int xR,int yB,int x1,int y1,int x2,int y2)

{

float dx,dy,u1,u2;

u1=0.0;u2=1.0;

dx=x2-x1;

if(ClipT(-dx,x1-xL,u1,u2))

if(ClipT(dx,xR-x1,u1,u2))

{

dy=y2-y1;

if(ClipT(-dy,y1-yT,u1,u2))

if(ClipT(dy,yB-y1,u1,u2))

{

if(u21.0)

{

x2=x1+u2*dx;

y2=y1+u2*dy;

}

if(u10.0)

{

x1=x1+u1*dx;

y1=y1+u1*dy;

}

line(x1,y1,x2,y2);

}

}

}

void main(void)

{

int gdriver=DETECT,gmode;

int XL,XR,YB,YT;

int x0,y0,x1,y1;

do

{

registerbgidriver(EGAVGA_driver);

initgraph(gdriver,gmode,"");

cleardevice();

printf("\nLiang_Barsky\n");

printf("\n");

printf("Please input the line node(x0,y0,x1,y1):\n");

scanf("%d,%d,%d,%d",x0,y0,x1,y1);

printf("\n");

cleardevice();

setcolor(LINE_COLOR);

line(x0,y0,x1,y1);

getch();

printf("\nLiang_Barsky\n");

printf("\n");

printf("Please input the rectangle point(XL,YT,XR,YB):\n");

scanf("%d,%d,%d,%d",XL,YT,XR,YB);

printf("\n");

cleardevice();

line(x0,y0,x1,y1);

setcolor(WINDOW_COLOR);

rectangle(XL,YT,XR,YB);

getch();

cleardevice();

rectangle(XL,YT,XR,YB);

setcolor(LINE_COLOR);

Liang_Barsky(XL,YT,XR,YB,x0,y0,x1,y1);

getch();

printf("\n\n Continue?(y|n?)");

getchar();

}while(getchar()=='y'||getchar()=='Y');

printf("\n");

printf("press any key to end!");

getch();

closegraph();

}

裁剪算法

OpenGL中经常用到裁剪,这里记录下裁剪的一些基本算法和概念。

裁剪就是去掉窗口外不可见的部分,保留在窗口中的内同。是OpenGL的管线中必不可少的一步,裁剪算法的执行效率会直接影响整个程序的效率。

裁剪可以按照线或面进行,一般使用规则裁剪框进行裁剪,也有用不规则图形进行裁剪,常见的是使用矩形框进行裁剪。

裁剪过程的难度随裁剪区域的复杂度和被裁剪物体的形状复杂程度增加。

这里用矩形裁剪框解释常用的裁剪算法。

点的裁剪相对简单,已知矩形裁剪框的两个对角线顶点坐标A(x1,y1)、B(x2,y2),判断点P(x,y)是不是在A、B坐标范围内即可。

若:

min(x1,x2) = x = max(x1,x2);

min(y1,y2) = y = max(y1,y2);

则P点在裁剪框中,否则在裁剪框外。

这里说的直线,都是线段。线的裁剪算法有很多,常见的有:cohen-sutherland算法,中点分割裁剪算法,Liang-Barsky算法,beck算法等。

这个算法的主要思想是,用四位掩码做运算判断线是否在裁剪框内,如果在或全部在裁剪框外,结束。如果部分在窗口中,用线和裁剪框的交点对线段进行分割,然后分割后的继续重复判断。步骤如下:

设要裁剪的线段是P0P1。从P0端点出发,找出离P0点最近的可见点。从P1端点出发,找出离P1点最近的可见点。这两个可见点的连线就是裁剪框中的要保留的部分。

找可见点的方法用二分法,先取线段的中点M点,判断P1M是否可见,如果不能定为不可见,用P1M线段再2分,重复判断。


推荐阅读
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • oracle c3p0 dword 60,web_day10 dbcp c3p0 dbutils
    createdatabasemydbcharactersetutf8;alertdatabasemydbcharactersetutf8;1.自定义连接池为了不去经常创建连接和释放 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有