此算法只能裁剪凸多边形

先看俩个例子

算法基本思想:

基本思想:一次用窗口的一条边来裁剪多边形。

算法的输入是以顶点序列表示的多边形,输出也是一个顶点序列,这些顶点能够构成一个或多个多边形。

处理对象:任意多边形。

窗口的任意一条边的所在直线(裁剪线)把窗口所在平面分成两部分:

可见一侧:包含窗口那部分

不可见一侧:不包含窗口那部分

l将每条线段的端点S, P与裁剪线比较之后,可以输出02个点:

(1) S, P都在可见一侧,输出顶点P

(2) S, P都在不可见一侧,输出0个顶点。

(3) S在可见一侧,P在不可见一侧,输出SP与裁剪线的交点I

(4) S在不可见一侧,P在可见一侧,输出SP与裁剪线的交点I顶点P

例如:

代码实现:

#include<iostream>
using namespace std; const int MAX_POINTS = 20; //交点横坐标
int x_intersect(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{ int num = (x1*y2 - y1*x2) * (x3-x4) - (x1-x2) * (x3*y4 - y3*x4); int den = (x1-x2) * (y3-y4) - (y1-y2) * (x3-x4); return num/den;
}
//返回交点纵坐标
int y_intersect(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
{ int num = (x1*y2 - y1*x2) * (y3-y4) - (y1-y2) * (x3*y4 - y3*x4); int den = (x1-x2) * (y3-y4) - (y1-y2) * (x3-x4); return num/den;
} // 裁剪
void clip(int poly_points[][2], int &poly_size, int x1, int y1, int x2, int y2)
{ int new_points[MAX_POINTS][2], new_poly_size = 0; for (int i = 0; i < poly_size; i++) { int k = (i+1) % poly_size; int ix = poly_points[i][0], iy = poly_points[i][1]; int kx = poly_points[k][0], ky = poly_points[k][1]; int i_pos = (x2-x1) * (iy-y1) - (y2-y1) * (ix-x1); //标志int k_pos = (x2-x1) * (ky-y1) - (y2-y1) * (kx-x1); // Case 1 if (i_pos < 0  && k_pos < 0) { new_points[new_poly_size][0] = kx; new_points[new_poly_size][1] = ky; new_poly_size++; } // Case 2else if (i_pos >= 0  && k_pos < 0) { new_points[new_poly_size][0] = x_intersect(x1, y1, x2, y2, ix, iy, kx, ky); new_points[new_poly_size][1] = y_intersect(x1, y1, x2, y2, ix, iy, kx, ky); new_poly_size++; new_points[new_poly_size][0] = kx; new_points[new_poly_size][1] = ky; new_poly_size++; } // Case 3else if (i_pos < 0  && k_pos >= 0) {        new_points[new_poly_size][0] = x_intersect(x1,y1, x2, y2, ix, iy, kx, ky); new_points[new_poly_size][1] = y_intersect(x1,y1, x2, y2, ix, iy, kx, ky); new_poly_size++; } // Case 4 不添加点else{ } } poly_size = new_poly_size; for (int i = 0; i < poly_size; i++) { poly_points[i][0] = new_points[i][0]; poly_points[i][1] = new_points[i][1]; }
} void suthHodgClip(int poly_points[][2], int poly_size, int clipper_points[][2], int clipper_size)
{ for (int i=0; i<clipper_size; i++) { int k = (i+1) % clipper_size; clip(poly_points, poly_size, clipper_points[i][0], clipper_points[i][1], clipper_points[k][0], clipper_points[k][1]); } for (int i=0; i < poly_size; i++) cout << '(' << poly_points[i][0] << ", " << poly_points[i][1] << ") ";
}
int main()
{ int poly_size = 3; int poly_points[20][2] = {{100,150}, {200,250}, {300,200}}; int clipper_size = 4; int clipper_points[][2] = {{150,150}, {150,200}, {200,200}, {200,150} }; //三角形裁剪区域/*int clipper_size = 3; int clipper_points[][2] = {{100,300}, {300,300}, {200,100}};*/suthHodgClip(poly_points, poly_size, clipper_points, clipper_size); return 0;
} 

输出:

(150,162)(150,200)(200,200)(200,174)

基于vs2010MFC实现

上图

其他图形学代码下载:https://download.csdn.net/download/qq_40310876/11222412

来源于中华女子学院山东分校赵晓峰的论文

多边形裁剪|Sutherland-Hodgman相关推荐

  1. 计算机图形学在线考试题,图形学模拟试题含答案.doc

    <图形学模拟试题含答案.doc>由会员分享,可在线阅读,更多相关<图形学模拟试题含答案.doc(9页珍藏版)>请在装配图网上搜索. 1.计算机图形学课程模拟试卷 (参考答案含评 ...

  2. java实现线段裁剪算法,多边形裁剪算法java

    Weiler-Atherton 任意多边形裁剪 Sutherland-Hodgeman 算法解决了裁剪窗口为凸多边形窗口的问题,但一些应用需要涉及 任意多边形窗口(含凹多边形窗口)的裁剪.Weiler ...

  3. 计算机图形学 多边形裁剪

    多边形裁剪 多边形裁剪 Sutherland Hodgeman多边形裁剪 新点的产生与旧点的保留及其二者的输出确定 第一点S在不可见侧,第二点P在可见侧 第一点S和第二点P都在可见侧 第一点S在可见侧 ...

  4. 3.qt-图解Weiler-Atherton任意多边形剪裁算法

    1.Weiler-Atherton多边形剪裁算法 Weiler-Atherton剪裁算法是一个适用于凸的.凹的和带孔的多边形的裁剪算法. 裁剪窗口可以是矩形.任意凸多边形.任意凹多边形. 与 Suth ...

  5. matlab z变换离散化_用C++编写一个简单的光栅化渲染器:3D篇

    3D光栅化与2D光栅化在图元绘制方面差别并不大,3D光栅化主要是多了很多坐标系(Local,world,View...),除此外遮挡算法和裁剪算法也会稍微复杂一些. 本篇文章的重点就主要集中在各种坐标 ...

  6. 多边形裁剪一:Sutherland-Hodgman算法

    Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的.这种算法采用了分割处理.逐边裁剪的方法.一,基本思 ...

  7. 图形学基础笔记III:图形管线中的多边形裁剪算法、Sutherland-Hodgman、Guard Band Clipping

    这个主要讲的是viewport 里的. 从 frustum (根据 fov 视场角 和 aspect ratio 纵横比决定 lrbt,front.near 是由摄像机距离和世界大小决定的)到 vie ...

  8. Sutherland-Hodgeman 逐次裁剪法(多边形裁剪)

    Sutherland-Hodgeman多边形裁剪算法思想: 每次用窗口的一条边界(包括延长线)对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧的顶点,删除外侧的顶点,同时,适时地 ...

  9. 与Jeff Sutherland谈敏捷领导力

    在GOTO阿姆斯特丹2015大会上,Jeff Sutherland谈了敏捷领导力.InfoQ对他进行了采访,内容涉及:大型组织在采用Scrum时面临的问题:他们该如何提高处理障碍.提升敏捷领导力的能力 ...

  10. python多边形裁剪

    目录 选择多边形区域ROI: 多边形裁剪: 加个顺时针排序: 选择多边形区域ROI: import cv2 import numpy as np import joblibpts = [] # 用于存 ...

最新文章

  1. Struts07---访问servlet的API
  2. arch linux引导不启动_Linux 内核源代码的目录结构
  3. LTV(CLV)模型的实战案例
  4. api 获取网络使用情况_您的API是什么情况?
  5. 11 - java构造方法
  6. DCL 管理权限 mysql
  7. CentOS7升级openssh8.0及升级后无法root登陆处理
  8. Mysql 添加用户 授权等操作
  9. 用了10年海尔家电,青岛一音乐老师为海尔写了1首歌
  10. 推荐PDG阅读器UnicornViewer
  11. linux ftp切换目录命令,linux FTP命令详解
  12. exchange server 2007 边缘传输服务器 垃圾邮件,边缘传输 启用反垃圾邮件更新向导 启用反垃圾邮件更新页...
  13. 【老九学堂】【初识C语言】C语言基本数据类型
  14. input标签 设置纯数字输入
  15. 麒麟座V3.1接入OneNET平台初体验--上传温湿度
  16. LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。
  17. microLite_timer,简洁、小巧精干的软件定时器
  18. 合肥工业大学机器人技术实验五十六题
  19. 我国古代的度量衡和音律的关系
  20. 扩展正则表达式之加号

热门文章

  1. 【硬件学习】Type-C接口
  2. [群晖]此套件需要您启动[pgsql-adapter.service]
  3. 福州区网吧管理计费解决方案(转)
  4. 集成GoogleMap,实现定位和获取位置信息
  5. LaTeX转义特殊符号
  6. html下拉菜单会影响下一行,CSS下拉菜单导致后续内容无法撑满页面
  7. 这个要怎么写呢。。。
  8. python单词词频字典_Python字典使用--词频统计的GUI实现
  9. 运动捕捉数据的描述ASF/AMC
  10. 凡是过去,皆为序章,