随便记一下书上的代码
好多奇怪的BUG哦。

#include<gl/glut.h>
#include<stdio.h>
#include<stdlib.h>
bool bInput, accept, bDraw;
struct ClipWindow {float xmin, ymin, xmax, ymax;
}rect;
struct Point {int x, y;
}pt[2];
void LineGL(Point pt0, Point pt1) {glBegin(GL_LINES);glColor3f(0.0f, 0.0f, 0.0f);glVertex2f(pt0.x, pt0.y);glColor3f(0.0f, 0.0f, 0.0f);glVertex2f(pt1.x, pt1.y);glEnd();
}
void PointGL(Point pt) {glPointSize(2);glBegin(GL_POINTS);glColor3f(0.0f, 0.0f, 0.0f);glVertex2f(pt.x, pt.y);glEnd();
}
int clipTest(float p, float q, float *u1, float *u2) {float r;;int retVal = 1;if (p < 0) {r = q / p;if (r > *u2)retVal = 0;//(起点到裁剪边界投影距离/起点到终点投影距离) 大于1,终点未能抵达边界,无交else if (r > *u1)*u1 = r;} else if (p > 0) {r = q / p;if (r < *u1)retVal = 0;//(起点到裁剪边界投影距离/起点到终点投影距离) 小于0,起点已经越过边界,无交else if (r < *u2)*u2 = r;} else if (q < 0)retVal = 0;return retVal;
}
int L_B_LineClip(Point pt1, Point pt2, ClipWindow rect) {float x1, y1, x2, y2;x1 = pt1.x;x2 = pt1.y;y1 = pt2.x;y2 = pt2.y;float u1 = 0, u2 = 1, dx = x2 - x1, dy;if (clipTest(-dx, x1 - rect.xmin, &u1, &u2))if (clipTest(dx, rect.xmax - x1, &u1, &u2)) {//&&dy = y2 - y1;if (clipTest(-dy, y1 - rect.ymin, &u1, &u2))if (clipTest(dy, rect.ymax - y1, &u1, &u2)) {if (u2 < 1) {x2 = x1 + u2 * dx;y2 = y1 + u2 * dy;pt[1].x = x2;pt[1].y = y2;}if (u1 > 0) {x1 += u1 * dx;y1 += u1 * dy;pt[0].x = x1;pt[0].y = y1;}return 1;}}return 0;
}
void myDisplay() {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f, 1.0f, 1.0f);glRectf(rect.xmin, rect.ymin, rect.xmax, rect.ymax);if (accept) {if (bDraw) LineGL(pt[0], pt[1]);else PointGL(pt[0]);}glFlush();
}
void Init() {glClearColor(0.5, 0.5, 0.5, 0.0);glShadeModel(GL_SMOOTH);rect.xmin = 250;rect.xmax = 450;rect.ymin = 200;rect.ymax = 400;accept = true;bInput = false;printf("Press Left Mouse Button to Draw two Point to create a line!\n");printf("Press key 'c' to Clip!\n");
}
void Reshape(int w, int h) {glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
void keyboard(unsigned char key, int x, int y) {switch (key) {case 'c':if (L_B_LineClip(pt[0], pt[1], rect))glutPostRedisplay();else {bDraw = false;glutPostRedisplay();}break;case 'r':Init();bDraw = false;glutPostRedisplay();break;default:break;}
}
void mouse(int button, int state, int x, int y) {switch (button) {case GLUT_LEFT_BUTTON:if (state == GLUT_DOWN) {if (bInput == false) {pt[0].x = x;pt[0].y = 480-y;//转成向上的ybInput = true;bDraw = false;accept = true;glutPostRedisplay();}else {pt[1].x = x;pt[1].y = 480 - y;bDraw = true;bInput = false;glutPostRedisplay();}}break;default:break;}
}
int main(int argc, char **argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(500, 200);glutInitWindowSize(640, 480);glutCreateWindow("LB直线段裁剪算法");Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutKeyboardFunc(keyboard);glutMouseFunc(mouse);glutMainLoop();return 0;
}

Liang-Barsky直线段裁剪相关推荐

  1. 实验二 实现中点分割直线段裁剪算法

    一.目的 1. 了解直线裁剪的基本原理和常用方法. 2. 掌握中点分割直线段裁剪算法的基本原理和步骤. 3. 使用C++.OpenGL编程实现如下内容:输入直线段的起始点和终止点坐标位置.用四边形模拟 ...

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

    计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 计算机图形学-3.2用Liang-Barsky算法实现直线段裁剪 (1)算法设计原理 依次处理(p1,q1)(p2,q2)(p3,q3 ...

  3. Liang-Barsky直线段裁剪算法-C++实现(计算机图形学作业)

    #include<graphics.h>//梁式直线裁剪算法的程序,由于该方法用编程实现非常简单,在介绍时稍微简略一些 void Liang_Barsky(const int& x ...

  4. 计算机图形学(三):三维图形观察及应用(矩形窗直线段的裁剪算法)

    裁剪:使用计算机处理图形信息时,计算机内部存储的图形往往比较大,而屏幕显示的只是图形的一部分.因此需要确定图形哪些部分落在显示区内,哪些落在显示区外.这个选择的过程就称为裁剪. 最简单的裁剪方法是把各 ...

  5. 计算机图形学:Cohen-Sutherland直线段剪裁算法及梁友栋-Barsky裁剪算法(算法原理及代码实现)

    一.算法实现原理 Cohen-Sutherland直线段剪裁算法: 算法原理: (1)判断线段两端是否都落在窗口内,如果是,则线段完全可见,否则进行下一步 (2)判断线段两端是否都落在窗口外,如果是, ...

  6. MFC鼠标绘制直线段并使用编码裁剪算法

    聪明的你通过本文可以学会在MFC中 初始化时绘制自定义矩形框 使用鼠标来实时绘制你想要的直线段 实现编码裁剪算法裁去直线段在自定义矩形框以外的部分 完成效果如下 进入运行界面 鼠标绘制直线 编码算法裁 ...

  7. 直线段检测算法(LSD:a Line Segment Detector)

    直线段检测算法(LSD:a Line Segment Detector) 1 简介 LSD是一种线段检测算法,该方法能在较短的时间内获得较高精度的直线段检测结果. LSD直线检测算法首先计算图像中所有 ...

  8. 计算机图形学 实验6 直线的裁剪—Cohen Sutherland裁剪算法(MFC中)

    实验目的: 理解裁剪的作用 掌握直线裁剪的算法 实验内容: 一.编写程序实现Cohen Sutherland裁剪算法 算法原理: 首先判断直线段是否全部在窗口内,是,则保留:不是,则再判断是否完全在窗 ...

  9. 【计算机图形学】【OpenGL】基于窗口的Liang-Barsky的折线段裁剪的实现

    计算机图形学课程实验,出于记录和分享学习过程的目的写下此博客.由于是第一次写博客,不足之处还望指出. 目录 实验要求: 实现效果: 头文件: Liang-Barsky算法部分: 实现部分: 全局变量定 ...

  10. 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...

    PAGE 32 PAGE 7 计算机图形学 实验报告 班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其 ...

最新文章

  1. winphone8 模拟器设置(新)
  2. 微信小程序 wxml 中使用 js函数
  3. 【深度学习】ReLU激活函数的缺点
  4. 转载:pycharm最新版新建工程没导入本地包问题:module 'selenium.webdriver' has no attribute 'Firefox'...
  5. 特征点检测 FAST算法及代码详解
  6. mysql用户_MySQL用户权限管理详解
  7. linux启用ipmi服务,使用 ipmitool 实现 Linux 系统下对服务器的 ipmi 管理
  8. 一款好看新颖的404页面源码
  9. hbase分布式集群搭建
  10. 测试打印机性能的软件,打印性能测试(一)
  11. react 多行或单行文本溢出省略显示省略号(...)
  12. 米游社-原神每日签到含DS算法
  13. 商业数据分析师的发展前景
  14. 记一次Maya使用入门
  15. Vue 中监控 img 加载完毕事件
  16. C++11介绍之vector::push_back和vector::emplace_back区别
  17. 每天五分钟机器学习:随着算法迭代次数动态调整学习率
  18. springboot实现高并发红包系统(java 全网最全包括语音口令 文字口令 普通 拼手气)
  19. 青云QingCloud 在不同场景化中的云计算应用
  20. 《Modulated Fusion using Transformer for Linguistic-Acoustic EmotionRecognition》论文翻译

热门文章

  1. Arduino PS2摇杆
  2. HTML .CSS实现商品详情(detail)
  3. macbookpro2011安装单系统win10
  4. ice的意思_ice是什么意思_ice的翻译_音标_读音_用法_例句_爱词霸在线词典
  5. g5500服务器装系统,联想G50笔记本U盘重装win10系统教程
  6. Python模拟轮盘抽奖游戏
  7. GoCN社区Go读书会第二期:《Go语言精进之路》直播文字稿
  8. UVM实战 卷I学习笔记14——OVM到UVM的迁移
  9. win7笔记本电脑设置WiFi热点
  10. 在centos上安装pycharm