计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪

计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪

(1)算法设计原理

依次处理(p1,q1)(p2,q2)(p3,q3)(p4,q4)四组数据:把(pk,qk)作为ClipT函数的输入变量

p1=p2=0时,若q1<0或q2小于0,直线在窗口外

P3=p4=0时,若q3<0或q4小于0,直线在窗口外

那么,pk=0并且qk<0时,不画线,设成返回false;

p1=p2=0时,若q1>=0且q2>=0,计算uk|pk<0,和umax比较大小成为新的umax,计算 uk|pk>0,和umin比较大小成为新的umin,k=3,4

P3=p4=0时,若q3>=0且q4>=0,计算uk|pk<0,和umax比较大小成为新的umax,计算 uk|pk>0,和umin比较大小成为新的umin,k=1,2

P1!=p2时,计算uk|pk<0,和umax比较大小成为新的umax,计算 uk|pk>0,和umin比较大小成为新的umin,k=1,2,3,4

在Clip函数中,pk<0,则计算相应的uk|pk<0,并和umax比较;

pk>0,计算相应的uk|pk>0,并和umin比较;

剩下pk=0的情况,qk<0,直线在窗口外;返回false

qk>0,不需要进行操作;

k分别等于1,2,3,4后,所有直线在窗口外的情况都返回了false,并得到了umax,umin。

(2)程序关键代码

(3)运行结果截屏(对数据输入的说明)

完整代码:

#define xl 150

#define xr 300

#define yb 150

#define yt 300

#include

#include

#include

#include

//当线段完全不可见时,返回false,否则,返回true

bool ClipT(double p,double q,double &t0,double &t1)

{

double r;

if(p<0)

{

r=(double)q/(double)p;

if(r>t1)

return false;

else if (r>t0)

{

t0=r;

return true;

}

}

else if (p>0)

{

r=(double)q/(double)p;

if(r

return false;

else if(r

{

t1=r;

return true;

}

}

else if(q<0)

return false;

return true;

}

void L_B_line(double x1,double y1,double x2,double y2)

{

double dx,dy,umin,umax;

umin=0;umax=1;

dx=x2-x1;

//若x1,x2相同,p1=p2=0,q1<0,则直线不在窗口内,返回false,结束

//x1,x2相同,umin=0,umax=1

//x1,x2不同情况下,计算uk|pk<0,和umax比较大小成为新的umax,计算 uk|pk>0,和umin比较大小成为新的umin

if(ClipT(-dx,x1-xl,umin,umax))

//若x1,x2相同,p1=p2=0,q2<0,则直线不在窗口内,返回false,结束

//x1,x2相同,umin不变,umax不变

//x1,x2不同情况下,计算uk|pk<0,和umax比较大小成为新的umax,计算 uk|pk>0,和umin比较大小成为新的umin

if(ClipT(dx,xr-x1,umin,umax))

{

dy=y2-y1;

//若y1,y2相同,p3=p4=0,q3<0,则直线不在窗口内,返回false,结束

//y1,y2相同,umin不变,umax不变

//计算y1,y2不同情况下,计算uk|pk<0,和umax比较大小成为新的umax,计算 uk|pk>0,和umin比较大小成为新的umin

if(ClipT(-dy,y1-yb,umin,umax))

//若y1,y2相同,p3=p4=0,q4<0,则直线不在窗口内,返回false,结束

//x1,x2相同,umin不变,umax不变

//计算y1,y2不同情况下,计算uk|pk<0,和umax比较大小成为新的umax,计算 uk|pk>0,和umin比较大小成为新的umin

if(ClipT(dy,yt-y1,umin,umax))

line((int)(x1+umin*dx),(int)(y1+umin*dy),(int)(x1+umax*dx),(int)(y1+umax*dy));

}

}

void main()

{

initgraph(640,480);

setlinecolor(WHITE);

line(xl,yt,xr,yt);

line(xl,yb,xr,yb);

line(xl,yt,xl,yb);

line(xr,yt,xr,yb);

double x0,y0,x1,y1;

//用鼠标获取点的位置

MOUSEMSG m;

while(true)

{flag:

m=GetMouseMsg();//获取一次鼠标消息

switch(m.uMsg)

{

case WM_LBUTTONDOWN:

x0=m.x;y0=m.y;

setcolor(RED);

circle((int)x0,(int)y0,2);

while(true)

{

m=GetMouseMsg();//再获取一次鼠标消息

switch(m.uMsg)

{

case WM_LBUTTONDOWN:

x1=m.x;y1=m.y;

circle((int)x1,(int)y1,2);

setcolor(RED);

line((int)x0, (int)y0, (int)x1, (int)y1);

setcolor(YELLOW);

L_B_line((int)x0,(int)y0,(int)x1,(int)y1);

goto flag;

}

}

}

}

_getch();

closegraph();

}

计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪相关教程

计算机图形学直线裁剪原理,计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪...相关推荐

  1. 计算机主板的工作原理,计算机主板的工作原理.doc

    计算机主板的工作原理 计算机主板构造和工作原理 主板通常拥有多种不同的内置功能,并且可以直接影响计算机的功能和升级潜力.在本文中,我们将了解一下主板的通用部件.随后,我们将仔细研究显著影响计算机性能的 ...

  2. 计算机组成原理与系统结构原理,计算机组成原理与系统结构

    <计算机组成原理与系统结构>由会员分享,可在线阅读,更多相关<计算机组成原理与系统结构(25页珍藏版)>请在人人文库网上搜索. 1.计算机组成原理与系统结构,教学重点:计算机的 ...

  3. 计算机图形学曲线生成原理,计算机图形学_曲线及生成.ppt

    计算机图形学_曲线及生成 华中理工大学计算机学院 陆枫 99-7 1999年7月 7.2.1 曲线的表示要求 1)唯一性 2)几何不变性 3)易于定界 4)统一性 5)易于实现光滑连接 6)几何直观 ...

  4. 计算机的定点运算器原理,计算机组成原理定点运算器的组成及结构.doc

    计算机组成原理 第八章 定点运算器的组成和结构 1. 算术逻辑单元(简称ALU) ? 针对每一种算术运算,都必须有一个相对应的基本硬件配置,其核心部件是加法器和寄存器.当需完成逻辑运算时,势必需要配置 ...

  5. 计算机完成逻辑运算的原理,计算机组成原理2.5.1逻辑运算.ppt

    计算机组成原理2.5.1逻辑运算 2.5 定点运算器的组成 2.5.1 逻辑运算 2.5.2 多功能算术/逻辑运算单元(ALU) 2.5.1 逻辑运算 所谓逻辑数,是指不带符号的二进制数. 计算机中的 ...

  6. 简述计算机数控系统的工作原理,计算机数控系统复习题-20210321010307.docx-原创力文档...

    "计算机数控系统"复习题 一.填 空: 1.数控技术的发展方向是高精度.高速度.高可靠性.多功能和小型化.智 能化.数控网络化和( 开放式)等方向.开放式的数控系统应是一个 ( 模 ...

  7. 计算机组成流水灯原理,计算机组成原理课程设计(微程序设计)

    <计算机组成原理课程设计(微程序设计)>由会员分享,可在线阅读,更多相关<计算机组成原理课程设计(微程序设计)(13页珍藏版)>请在人人文库网上搜索. 1.计算机组成原理课程设 ...

  8. 计算机算log的原理,语音声学特征提取:MFCC和LogFBank算法的原理

    语音声学特征提取:MFCC和LogFBank算法的原理 语音识别 最后更新 2021-03-04 11:57 阅读 998 最后更新 2021-03-04 11:57 阅读 998 语音识别 几乎任何 ...

  9. 计算机的定点运算器原理,计算机组成原理第二章第10讲定点运算器的组成.ppt

    <计算机组成原理第二章第10讲定点运算器的组成.ppt>由会员分享,可在线阅读,更多相关<计算机组成原理第二章第10讲定点运算器的组成.ppt(20页珍藏版)>请在装配图网上搜 ...

最新文章

  1. 在VSO8中使用QT
  2. vue方法传值到data_vue组件传值的几种方式
  3. linux图形化卡在开机界面,linux怎么在开机时进入图形界面
  4. 同级选择器_基础选择器
  5. python3循环一直到一个值结束_一步一步学Python3(小学生也适用) 第十七篇:循环语句for in循环...
  6. 程序员“离职小技巧”
  7. yii mysql 2002_laravel 中出现SQLSTATE[HY000] [2002] 如何解决?
  8. [转]oracle分页用两层循环还是三层循环?
  9. 小程序开发合同_微信小程序怎么做?微信小程序制作流程? | 微信开放社区
  10. SQL Pass北京举办第六次线下活动,欢迎报名
  11. 基于JavaWeb的12306网络购票系统设计与实现 文档+项目源码+脚本文件
  12. 【WPS表格】快捷键合集(更新中)
  13. 通达oa php漏洞,通达OA前台任意用户登录漏洞
  14. #Android-中控指纹仪Live R20 开发注意事项#
  15. 通俗易懂地理解傅里叶变换
  16. android studio安装SDK时无法勾选
  17. PAT 1003 我要通过! python
  18. 9本4月程序员新书,Python书就占了6本
  19. 基于Java的快递管理系统(LMS)设计与实现 毕业论文+项目源码及数据库文件
  20. Linux软件防火墙:iptables

热门文章

  1. 二维码制作软件----如何让二维码内容换行显示
  2. Processing 入门教程(三十) lerpColor颜色渐变
  3. 利用o(nlogn)的时间复杂度对某一个区间进行质因数分解
  4. STM32+光敏模块
  5. 曲面的渐近方向和共轭方向、主方向、曲率线网
  6. Django 项目管理
  7. 【js-xlsx和file-saver插件】前端html的table导出数据到excel的表格合并显示boder
  8. 未来计算机长啥样,未来人类到底会长成啥样?科学家公布最终模拟图!
  9. Python多继承mro
  10. wap,WML语言与编程