多边形裁剪|Sutherland-Hodgman
此算法只能裁剪凸多边形
先看俩个例子
算法基本思想:
基本思想:一次用窗口的一条边来裁剪多边形。
算法的输入是以顶点序列表示的多边形,输出也是一个顶点序列,这些顶点能够构成一个或多个多边形。
处理对象:任意凸多边形。
窗口的任意一条边的所在直线(裁剪线)把窗口所在平面分成两部分:
可见一侧:包含窗口那部分
不可见一侧:不包含窗口那部分
l将每条线段的端点S, P与裁剪线比较之后,可以输出0~2个点:
(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相关推荐
- 计算机图形学在线考试题,图形学模拟试题含答案.doc
<图形学模拟试题含答案.doc>由会员分享,可在线阅读,更多相关<图形学模拟试题含答案.doc(9页珍藏版)>请在装配图网上搜索. 1.计算机图形学课程模拟试卷 (参考答案含评 ...
- java实现线段裁剪算法,多边形裁剪算法java
Weiler-Atherton 任意多边形裁剪 Sutherland-Hodgeman 算法解决了裁剪窗口为凸多边形窗口的问题,但一些应用需要涉及 任意多边形窗口(含凹多边形窗口)的裁剪.Weiler ...
- 计算机图形学 多边形裁剪
多边形裁剪 多边形裁剪 Sutherland Hodgeman多边形裁剪 新点的产生与旧点的保留及其二者的输出确定 第一点S在不可见侧,第二点P在可见侧 第一点S和第二点P都在可见侧 第一点S在可见侧 ...
- 3.qt-图解Weiler-Atherton任意多边形剪裁算法
1.Weiler-Atherton多边形剪裁算法 Weiler-Atherton剪裁算法是一个适用于凸的.凹的和带孔的多边形的裁剪算法. 裁剪窗口可以是矩形.任意凸多边形.任意凹多边形. 与 Suth ...
- matlab z变换离散化_用C++编写一个简单的光栅化渲染器:3D篇
3D光栅化与2D光栅化在图元绘制方面差别并不大,3D光栅化主要是多了很多坐标系(Local,world,View...),除此外遮挡算法和裁剪算法也会稍微复杂一些. 本篇文章的重点就主要集中在各种坐标 ...
- 多边形裁剪一:Sutherland-Hodgman算法
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的.这种算法采用了分割处理.逐边裁剪的方法.一,基本思 ...
- 图形学基础笔记III:图形管线中的多边形裁剪算法、Sutherland-Hodgman、Guard Band Clipping
这个主要讲的是viewport 里的. 从 frustum (根据 fov 视场角 和 aspect ratio 纵横比决定 lrbt,front.near 是由摄像机距离和世界大小决定的)到 vie ...
- Sutherland-Hodgeman 逐次裁剪法(多边形裁剪)
Sutherland-Hodgeman多边形裁剪算法思想: 每次用窗口的一条边界(包括延长线)对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧的顶点,删除外侧的顶点,同时,适时地 ...
- 与Jeff Sutherland谈敏捷领导力
在GOTO阿姆斯特丹2015大会上,Jeff Sutherland谈了敏捷领导力.InfoQ对他进行了采访,内容涉及:大型组织在采用Scrum时面临的问题:他们该如何提高处理障碍.提升敏捷领导力的能力 ...
- python多边形裁剪
目录 选择多边形区域ROI: 多边形裁剪: 加个顺时针排序: 选择多边形区域ROI: import cv2 import numpy as np import joblibpts = [] # 用于存 ...
最新文章
- Struts07---访问servlet的API
- arch linux引导不启动_Linux 内核源代码的目录结构
- LTV(CLV)模型的实战案例
- api 获取网络使用情况_您的API是什么情况?
- 11 - java构造方法
- DCL 管理权限 mysql
- CentOS7升级openssh8.0及升级后无法root登陆处理
- Mysql 添加用户 授权等操作
- 用了10年海尔家电,青岛一音乐老师为海尔写了1首歌
- 推荐PDG阅读器UnicornViewer
- linux ftp切换目录命令,linux FTP命令详解
- exchange server 2007 边缘传输服务器 垃圾邮件,边缘传输 启用反垃圾邮件更新向导 启用反垃圾邮件更新页...
- 【老九学堂】【初识C语言】C语言基本数据类型
- input标签 设置纯数字输入
- 麒麟座V3.1接入OneNET平台初体验--上传温湿度
- LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。
- microLite_timer,简洁、小巧精干的软件定时器
- 合肥工业大学机器人技术实验五十六题
- 我国古代的度量衡和音律的关系
- 扩展正则表达式之加号