- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
作物三(计算机图形学)
第4章 变换和裁剪 ;直线P0P1的参数方程;令;梁友栋-Barsky算法;设P0P1和两条始边的交点参数为t0’,t0”,令 t0 = max(t0’,t0”,0),
则t0就是P0P1和两条始边的交点与P0三点中最靠近P1的点的参数。
设P0P1和两条终边的交点参数为t1’,t1”,令 t1 = min(t1’,t1”,1),
则t1就是P0P1和两条终边的交点与P1三点中最靠近P0的点的参数。
当t1t0时,参数t?[t0,t1]的线段就是P0P1的可见部分
当t1t0时,整个线段为不可见。;初始化线段在边界内的端点参数为t0 = 0、t1 = 1。
计算出各个裁剪边界的q、d值。
当q = 0且d 0时,舍弃该线段;否则计算线段与边界的交点参数 t。
当q 0时,参数 t 用于更新 t0;
当q 0时,参数 t 用于更新 t1。
如果更新了 t0 或 t1 后,使t0 t1,则舍弃该线段。否则画出以t0和t1为参数的线段;梁友栋-Barsky算法;Cyrus-Beck裁剪算法(参数化裁剪算法);线段上的点和多边形的关系;现假设多边形有k条边,在每条边界Li上取1个点 Ai ,该点处的内法向量Ni(i=1,2,…,k),则可见线段的参数区间为下列不等式组的解; ;若对于某个i,有Ni ? (P2-P1)=0 ,这时,Ni ? P2-P1 ,P1P2 与对应边平行,如图所示。这时有两种情况:线段在区域外侧或内侧。前一种情况对应于 Ni ? (P1-Ai) 0 ;Cyrus-Beck算法;当凸多边形是矩形窗口,且矩形的边平行于坐标轴时,上述算法可简化为梁友栋-Barsky算法。由于每条边上法向量只有一个非零分量,所以任意一个向量与法向量求内积的运算很简单。; 多边形是由一组线段围成的封闭区域,线段裁剪是多边形裁剪的基础。下图(b)是多边形的线段被裁剪后的结果,但已不再是封闭的区域。正确的剪裁结果应是一个有边界的区域,即裁剪后的结果仍是一个(或多个)多边形 ,这就要求在裁剪过程中应当保留多边形的区域性质。;Sutherland-Hodgman算法;线段端点S、P与裁剪线的位置关系;Sutherland-Hodgman算法框图;1.从主函数得到待裁剪多边形的顶点序列P[][2]、顶点序列数n、窗口一条边界参数xl (假如为矩形窗口的左边界);
2.赋初值:
将顶点序列中的最后一个顶点赋给前一顶点S;
设置初始标志flag:
if (S在边界内侧)
flag=0;
else
flag=1;
设新的顶点序列数j=0;
;3、对多边形各顶点进行裁剪规则处理,结果放入新的多边形顶点序列Q[][2]中:
for(对第一个顶点直到最后一个顶点,逐一处理){
if (Pi在边界内侧){
if (flag!=0){
flag=0;
求交点并放入新的多边形顶点序列Qj中; j++;
}
将当前顶点放入新的多边形顶点序列Qj中:Qj=Pi; j++;
}
else{
if (flag==0){
flag=1;
求交点并放入新的多边形顶点序列Qj中; j++;
}
}
将当前顶点赋给S:S=Pi;
} ;Sutherland-Hodgeman算法;字符裁剪;结 束;练习题;完整Sutherland-Hodgman算法;clip_single_edge(int edge, const int TYPE, int nin, int *xin, int *yin, int *nout, int *xout, int *yout)
{
int i, k;
bool is_cross, is_in;
int x, y, x_intersect, y_intersect;
x = xin[nin-1]; y = yin[nin-1]; k=0;
for(i=0; inin-1; i++){
test_intersect(edge, type, x, y, xin[i], yin[i],
x_intersect, y_intersect, is_cross, is_in);
if(is_cr
文档评论(0)