恩..接着就是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实践相关推荐

  1. Cyrus Beck(参数化)裁剪算法基于opengl实现

    Cyrus Beck裁剪算法是计算机图形学中的一个实验,这个实验的难点在于理解,而不在于实现.这个算法也是基础算法里比较有趣的一个.CB算法只针对凸多边形,对于凹多边形不适用. Cyrus Beck算 ...

  2. 计算机图形学 裁剪算法源代码,OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc...

    OpenGL计算机图形学梁友栋裁剪算法实验代码及运行结果.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.9 积分  .<计算 ...

  3. 【计算机图形学 】Cohen-Sutherland 直线裁剪算法 | OpenGL+鼠标交互

    文章目录 其他计算机图形学实验 前言 代码借鉴 步骤 1.点的结构体 2. 创建用于裁剪的窗口并绘制 3.画点函数 4. Cohen-Sutherland 直线裁剪算法部分 4.1 判断点所在位置,生 ...

  4. 机器学习算法与Python实践之(二)支持向量机

    http://blog.csdn.net/zouxy09/article/details/17291543 机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己 ...

  5. 机器学习算法与Python实践之(四)支持向量机(SVM)实现

    机器学习算法与Python实践之(四)支持向量机(SVM)实现 zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是参考 ...

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

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

  7. 2.qt-Cyrus-Beck算法(凸多边形的线裁剪算法-C++实现)

    该算法比Cohen-Sutherland算法复杂不少, 它允许对非矩形窗口进行线剪裁.它还消除了Cohen-Sutherland算法中所需的重复计算 如下图所示: 如果线段部分位于凸多边形中或者完全在 ...

  8. kmeans算法原理以及实践操作

    原文:http://www.cnblogs.com/dudumiaomiao/p/5839905.html kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法) kmeans一般在数 ...

  9. 机器学习算法与Python实践之(六)二分k均值聚类

    机器学习算法与Python实践这个系列主要是参考<机器学习实战>这本书.因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学 ...

最新文章

  1. python2和python3区别
  2. python开发工程师面试题-超实用面试必看,Python工程师面试题
  3. onbeforeunload与onunload事件(转)
  4. Java 套接字Socket
  5. 简单的vue入门案例
  6. Spring—集成Junit
  7. asp.net运行时动态修改主题
  8. Redis的持久化 RDB AOF
  9. 泡泡龙游戏开发系列教程(四)
  10. 搜索引擎的一些简单命令-防止自己忘记系列
  11. 视频、图像原理 设配选择 图像出入门概念理解
  12. 【DA】用户粘性指标:日活/月活
  13. 7、快速更改subclass颜色
  14. 常用MOSFET管型号
  15. 【数据分析】电商平台入驻商用户画像分析
  16. linux网卡汇聚模式,Linux网卡聚合 linux多网卡绑定聚合之bond模式原理
  17. 华为路由器:ISIS基本原理与配置(含实验)
  18. 什么是软件模块化,为什么要模块化?
  19. MMORPG经济系统设计经验
  20. HTML5 input()标签

热门文章

  1. 计算机远程桌面连接开启,开启远程桌面【方法步骤】
  2. Matlab求微分方程de符号解
  3. 阿里云Docker Registry 操作指南
  4. Multidex记录二:缺陷解决
  5. matlab分离实部虚部,c – 如何在Eigen3库中有效地提取复杂矩阵的实部/虚部?
  6. 哈工大C语言大作业-学生成绩管理系统
  7. 留下的果然还是美好不舍的回忆
  8. Valine评论系统无法正常使用问题
  9. 无界鼠标:使用一套键盘鼠标控制多台电脑
  10. bezier curve使用