
计算机图形学裁剪试验报告怎么写
不知你的要求是什么我把我报告的一部分关于裁剪的粘给你 裁剪(clipping)是裁去窗口之外物体或物体部分的一种操作。
2.1 直线的剪裁 Cohen-Sutherland算法;2.2 多边形的剪裁 Sutlerland_Hodgman算法2.3 字符串的剪裁 裁剪:确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形。
这个选择过程称为裁剪。
窗口:画面上对应于屏幕显示的那部分区域成为窗口。
一般定义为矩形。
2.1 直线的剪裁 直线和窗口的关系可以分为如下3类(图2.20): ⑴ 整条直线在窗口内。
此时,不需剪裁,显示整条直线。
⑵ 整条直线在窗口外,此时,不需剪裁,不显示整条直线。
⑶ 部分直线在窗口内,部分直线在窗口外。
此时,需要求出直线与窗框的交点,并将窗口外的直线部分剪裁掉,显示窗口内的直线部分。
直线剪裁算法有两个主要步骤。
首先将不需剪裁的直线挑出,即删去在窗外的直线。
然后,对其余直线,逐条与窗框求交点,并将窗口外的 部分删去。
Cohen-Sutherland直线剪裁算法以区域编码为基础,将窗口及其周围的8个方向以4 bit的二进制数进行编码。
各编码分别代表窗外上下右左空间的编码 图2.21所示的编码方法将窗口及其邻域分为5个区域: ⑴ 内域:区域(0000)。
⑵ 上域:区域(1001, 1000, 1010)。
⑶ 下域:区域(0101, 0100, 0110)。
⑷ 左域:区域(1001, 0001, 0101)。
⑸ 右域:区域(1010, 0010, 0110)。
当线段的两个端点的编码的逻辑“与”非零时 ,线段为显然不可见的 对某线段的两个端点的区号进行位与运算,可知这两个端点是否同在视区的上、下、左、右; 算法的主要思想是,对每条直线P1P2: ⑴ 对直线两端点P1、P2编码分别记为 C1(P1)={a1, b1, c1, d1},C2(P2)={a2, <\\\/p>
b2, c2, d2}其中,ai、bi、ci、di取值范围为{1, 0},i∈{1, 2}。
⑵ 如果ai=bi=ci=di=0,则显示整条直线,取出下一条直线,返步骤(1)。
否则,进入步骤(3)。
⑶如果|a1-a2|=1,则求直线与窗上边(y=yw-max)的交点,并删去交点以上部分。
如果|b1-b2|=1,|c1-c2= |=1,|d1-d2|=1,作类似处理。
⑷ 返步骤(1)。
Cohen-Sutherland算法——C语言程序 #define LEFT 1 #define RIGHT 2 #define BOTTOM 4 #define TOP 8 int encode(float x,float y) { int c=0; if(x
Sutherland-Hodgeman算法—逐次多边形裁剪算法 基本思想:通过简单地一次用窗口的一条边裁剪多边形 算法:(1) 将多边形表示为顶点表,即{P1,P2,… … Pn-1,Pn }, 并生成边表P1P2, P2P3, … … Pn-1Pn, PnP1, (2) 用窗口边裁剪原多边形,生成中间多边形(3) 对中间多边形重复步骤(2), 直至被窗口所有边裁剪完为止 关键:根据多边形的边表,逐次对每一段边与裁剪线(窗口边)比较,判别输入顶点的个数和坐标,并联结成封闭多边形 实现方法:①设置二个表 输入顶点表(向量)—用于存放被裁剪多边形的顶点p1-pm。
输出顶点表(线性链表)—用于存放裁剪过程中及结果的顶点 q1-qn。
②输入顶点表中各顶点要求按一定顺序排列,一般可采用顺时针或逆时针方向。
③相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪。
具体操作: Pi 若位于边界线的可见一侧,则 Pi 送输出顶点表 Pi 若位于边界线的不可见一侧,则将其舍弃。
除第一个顶点外,还要检查每一个 Pi 和前一顶点 Pi-1是否位于窗口边界的同一侧,若不在同一侧,则需计算出交点送输出顶点表。
最后一个顶点 Pn则还要与 P1 一起进行同样的检查。
裁剪前: 裁剪后:输入顶点表:p1p2p3p4p5 输入顶点表: 不变输出顶点表:空 输出顶点表: q1q2p3q7q8q5q6q4q3 ??考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧??多边形的各条边的两端点S、P。
它们与裁剪线的位置关系只有四种 2.3 字符串的剪裁 字符串剪裁有3种可选择的方法。
⒈ 字符串的有或无剪裁 (all-or-none-text) ⒉ 字符的有或无剪裁 (all-or-none-character) ⒊ 字符的精密剪裁
计算机图形学直线段裁剪算法或二维基本变换算法,能复制运行的来啊,谢谢大侠们了 啊
#include #include typedef struct Point \\\/* 点 *\\\/{ int x; int y;}Point;\\\/* 点的平移变换 *\\\/void PinYi(int * x,int * y,int tx,int ty) { *x = *x + tx; *y = *y + ty;}\\\/* 点的旋转变换 *\\\/void XuanZhuan(int * x,int * y,float q) { int m ; int n; float Q; Q = (3.1415926\\\/180)*q; m = (*x); n = (*y); *x = m * cos(Q) - n * sin(Q); *y = m * sin(Q) + n * cos(Q);}void XuanZhuan_RY(int m,int n,int * x,int * y,float q)\\\/* 绕(m,n)的旋转*\\\/{ PinYi(x,y,-m,-n); XuanZhuan(x,y,q); PinYi(x,y,m,n);}void line_dda(int x1,int y1,int x2,int y2 ,COLORREF color){float x = 0.0;float y = 0.0;float = ( float )x1;float y3 = ( float )y1;float n;n=( float )( abs( x2-x1 ) >= abs( y2-y1 ) ? abs( x2-x1 ) : abs( y2-y1 ) );if( n != 0.0 ){x=( ( float )( x2-x1 ) ) \\\/ n;y=( ( float )( y2-y1 ) ) \\\/ n;}while( n >= 0 ){putpixel( ( int ) , ( int )y3 , color ); += x ;y3 += y ;n -= 1.0;}}void line(Point i,Point j,COLORREF color){line_dda(i.x,i.y,j.x,j.y,color);}Point p[4]={-50,50,50,50,-50,-50,50,-50};int PY[2]={0,0},XZ=0;void main(){int width=600,height=480;int zbx=200,zby=200;COLORREF color=0x00ff00;char ch;initgraph(width, height);ch=getch();for(int o=0;o<4;o++)PinYi(&p[o].x,&p[o].y,zbx,zby);while(ch=getch()){ PY[0]=0;PY[1]=0;XZ=0;switch(ch){case 'q': XZ--;break;case 'e': XZ++;break;case 'w': PY[1]--;break;case 's': PY[1]++;break;case 'a': PY[0]--;break;case 'd': PY[0]++;break;\\\/\\\/default :return 0;}for(int o=0;o<4;o++){PinYi(&p[o].x,&p[o].y,PY[0],PY[1]);PinYi(&zbx,&zby,PY[0],PY[1]);XuanZhuan_RY(zbx,zby,&p[o].x,&p[o].y,XZ);}cleardevice();line(p[0],p[1],color);line(p[1],p[2],color);line(p[2],p[3],color);line(p[3],p[0],color);}}有个问题是,,旋转的时候因为π取的3.1415926七位,所以越转越小需要改动
就不弄了,要睡了
求大神给个交互式二维图形编辑系统MFC
7、右击该图片将其置于底层。
3dmax存在几种将二维图形转为三维几何体的方法
3dsMax里将二维图形转为三维几何体方法有下面几种:1 将二维图形修改面板下的 在渲染中启用、在视口中启用 打钩。
2 添加挤出、扫描、倒角剖面等等修改器。
3 利用复合对象里的放样工具。
4 将二维图形转为高级编辑模式,比如转为可编辑多边形,在多边形级别选择多边形挤出。



