Cyrus-Beck裁剪算法及OpenGL实践
恩..接着就是Cyrus-Beck算法。这个算法比之前的Cohen-Sutherland算法厉害,处理任意凸多边形对线段的裁剪。自然,这个算法也比Cohen-Sutherland算法复杂不少。
首先,是线段与多边形相交的情况:
我们把定义向量c = (C - A),而线段AC是射线A + ct的一部分。那么t取0和1就是线段AC。我们将射线与多边形的每条边求出相交时的t。取tin = max(0, tin),tout = max(tout, 1)。最终会获得一个区间[tin,tout]就是经多边形裁剪后的线段。通过A+ct即可还原出裁剪后的线段。
那么怎么判断射线与多边形某一边相交时是射入还是射出呢,这就得先求出多边形的每条边的法向量了。规定法向量全部朝向多边形的外部。那么射线与该边的法向量的点积小于0,即夹角大于90°,肯定是射入;点积大于0,即夹角小于90°,则是射出。
于是问题就是怎么求出每条边的法向量。由于我们规定了多边形是凸的,并且法向量均指向外部,那么法向量与跟它相邻的边的夹角一定是在90°~180°之间,即点积小于0。故我们只要任意求出一个向量与这条边垂直,然后算它与下一条边的点积,如果大于零就把它反转方向即可。
一个例子如下:
接下就是代码了:
1 #include <GL/gl.h> 2 #include <GL/glu.h> 3 #include <GL/glut.h> 4 #include <iostream> 5 #include <vector> 6 #include <cmath> 7 using namespace std; 8 9 struct Point2D 10 { 11 float _x, _y; 12 Point2D() 13 { 14 _x = 0.0f; 15 _y = 0.0f; 16 } 17 Point2D(const Point2D& p) 18 { 19 _x = p._x; 20 _y = p._y; 21 } 22 Point2D(float xx, float yy) 23 { 24 _x = xx; 25 _y = yy; 26 } 27 Point2D& operator=(const Point2D& p) 28 { 29 _x = p._x; 30 _y = p._y; 31 return *this; 32 } 33 Point2D& operator+(const Point2D& p) 34 { 35 Point2D temp; 36 temp._x = _x + p._x; 37 temp._y = _y + p._y; 38 return temp; 39 } 40 Point2D& operator-(const Point2D& p) 41 { 42 Point2D temp(_x - p._x, _y - p._y); 43 return temp; 44 } 45 float operator*(const Point2D& p) 46 { 47 return _x * p._x + _y * p._y; 48 } 49 50 Point2D operator*(const float k) 51 { 52 return Point2D(_x * k, _y * k); 53 } 54 55 float length() 56 { 57 return sqrtf(_x * _x + _y * _y); 58 } 59 60 void InverseDir() 61 { 62 _x = -_x; 63 _y = -_y; 64 } 65 }; 66 67 struct Line2D 68 { 69 Point2D _start; 70 Point2D _end; 71 float _length; 72 73 Line2D() : _start(), _end() 74 { 75 _length = 0.0f; 76 } 77 Line2D(const Point2D& start, const Point2D& end) : _start(start), _end(end) 78 { 79 } 80 Line2D(const Line2D& line) : _start(line._start), _end(line._end) 81 {}
Cyrus-Beck裁剪算法及OpenGL实践相关推荐
- Cyrus Beck(参数化)裁剪算法基于opengl实现
Cyrus Beck裁剪算法是计算机图形学中的一个实验,这个实验的难点在于理解,而不在于实现.这个算法也是基础算法里比较有趣的一个.CB算法只针对凸多边形,对于凹多边形不适用. Cyrus Beck算 ...
- 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...
OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分 .<计算 ...
- 【计算机图形学 】Cohen-Sutherland 直线裁剪算法 | OpenGL+鼠标交互
文章目录 其他计算机图形学实验 前言 代码借鉴 步骤 1.点的结构体 2. 创建用于裁剪的窗口并绘制 3.画点函数 4. Cohen-Sutherland 直线裁剪算法部分 4.1 判断点所在位置,生 ...
- 机器学习算法与Python实践之(二)支持向量机
http://blog.csdn.net/zouxy09/article/details/17291543 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己 ...
- 机器学习算法与Python实践之(四)支持向量机(SVM)实现
机器学习算法与Python实践之(四)支持向量机(SVM)实现 zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考 ...
- 实验二 实现中点分割直线段裁剪算法
一.目的 1. 了解直线裁剪的基本原理和常用方法. 2. 掌握中点分割直线段裁剪算法的基本原理和步骤. 3. 使用C++.OpenGL编程实现如下内容:输入直线段的起始点和终止点坐标位置.用四边形模拟 ...
- 2.qt-Cyrus-Beck算法(凸多边形的线裁剪算法-C++实现)
该算法比Cohen-Sutherland算法复杂不少, 它允许对非矩形窗口进行线剪裁.它还消除了Cohen-Sutherland算法中所需的重复计算 如下图所示: 如果线段部分位于凸多边形中或者完全在 ...
- kmeans算法原理以及实践操作
原文:http://www.cnblogs.com/dudumiaomiao/p/5839905.html kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法) kmeans一般在数 ...
- 机器学习算法与Python实践之(六)二分k均值聚类
机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...
最新文章
- python2和python3区别
- python开发工程师面试题-超实用面试必看,Python工程师面试题
- onbeforeunload与onunload事件(转)
- Java 套接字Socket
- 简单的vue入门案例
- Spring—集成Junit
- asp.net运行时动态修改主题
- Redis的持久化 RDB AOF
- 泡泡龙游戏开发系列教程(四)
- 搜索引擎的一些简单命令-防止自己忘记系列
- 视频、图像原理 设配选择 图像出入门概念理解
- 【DA】用户粘性指标:日活/月活
- 7、快速更改subclass颜色
- 常用MOSFET管型号
- 【数据分析】电商平台入驻商用户画像分析
- linux网卡汇聚模式,Linux网卡聚合 linux多网卡绑定聚合之bond模式原理
- 华为路由器:ISIS基本原理与配置(含实验)
- 什么是软件模块化,为什么要模块化?
- MMORPG经济系统设计经验
- HTML5 input()标签