sutherland-hodgman 多边形裁剪算法

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

多边形剪裁作用

所谓多边形裁剪,就是在二维平面上有一堆多边,和一个矩形窗口。求出现在窗口里的部分是哪些。


蓝线为窗口

裁剪后如下


在这里我们规定矩形的边是平行于x轴和y轴的。

算法思想

一个多边形可以使用一个点序列表示,每两个连续的点可以组成一条多边形的边。可以对边进行裁剪,最终得到裁剪后多边形的点序列。

对裁剪窗口的一个边来说,有以上4种情况。
具体实现总结为2句话:

  1. 有交点加交点。
  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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值