欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。
多边形剪裁作用
所谓多边形裁剪,就是在二维平面上有一堆多边,和一个矩形窗口。求出现在窗口里的部分是哪些。

蓝线为窗口
裁剪后如下

在这里我们规定矩形的边是平行于x轴和y轴的。
算法思想
一个多边形可以使用一个点序列表示,每两个连续的点可以组成一条多边形的边。可以对边进行裁剪,最终得到裁剪后多边形的点序列。

对裁剪窗口的一个边来说,有以上4种情况。
具体实现总结为2句话:
- 有交点加交点。
- 末端点在窗口内,加入到队列中。
总体过程如下:

具体实现的时候
算法实现
#include "glew/2.2.0_1/include/GL/glew.h"
#include "glfw/3.3.4/include/GLFW/glfw3.h"
#include <iostream>
#include "model.h"
#include <cmath>
using namespace std;
class wcPt2D {
public:
double x, y;
wcPt2D() {
}
wcPt2D(double a, double b) : x(a), y(b) {
}
void out() {
printf("%.2f, %.2f\n", x, y);
}
};
typedef enum {
Left = 0, Right = 1, Bottom = 2, Top = 3
} Boundary;
GLint inside(wcPt2D p, Boundary b, wcPt2D wMin, wcPt2D wMax) {
switch (b) {
case Left:
if (p.x < wMin.x) return false;
break;
case Right:
if (p.x > wMax.x) return false;
break;
case Bottom:
if (p.y < wMin.y) return false;
break;
case Top:
if (p.y > wMax.y) return false;
break;
}
return true;
}
GLint cross(wcPt2D p1, wcPt2D p2, Boundary winEdge, wcPt2D wMin, wcPt2D wMax) {
auto b1 = inside(p1, winEdge, wMin, wMax);
auto b2 = inside(p2, winEdge, wMin, wMax);
return b1!=b2;


1万+

被折叠的 条评论
为什么被折叠?



