cohen sutherlandd hodgman找到点后怎么找到多边形

多边形裁剪一:Sutherland-Hodgman算法
Sutherland-Hodgman算法
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德(I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的。这种算法采用了分割处理、逐边裁剪的方法。
一,基本思想:
一次用窗口的一条边裁剪多边形。
考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧。多边形的各条边的两端点S、P。它们与裁剪线的位置关系只有四种
情况(1)仅输出1个顶点P;
情况(2)输出0个顶点;
情况(3)输出线段SP与裁剪线的1个交点I;
情况(4)输出线段SP与裁剪线的1个交点I和1个终点P
顺时针访问多边形各条边,可以以上面的基本思想来对上图多边形进行裁剪,可以得到正确的结果
  1、已知:多边形顶点数组src,顶点个数n,       定义新多边形顶点数组dest。
  2、赋初值:用变量flag来标识:          0表示在内侧,1表示在外侧。
3、对多边形的n条边进行处理,对当前点号的考虑为:0~n-1。   for(i=0;i&n;i++)   {    if(当前第i个顶点是否在边界内侧?)
{     if(flag!=0) /*前一个点在外侧吗?*/     {      flag=0;/*从外到内的情况,将标志置0,作为下一次循环的前一点标志*/      (dest + j) =求出交点; /*将交点dest放入新多边形*/
}          (dest + j)= (src + i); /*将当前点srci放入新多边形*/
}   else   {     if(flag==0) /*前一个点在内侧吗?*/     {      flag=1;/*从内到外的情况,将标志置1,作为下一次循环的前一点标志*/      (dest + j) =求出交点; /*将交点dest放入新多边形*/
}   }    s= (src + i); /*将当前点作为下次循环的前一点*/ }
三,算法特点:
  Sutherland-Hodgeman多边形裁剪算法具有一般性,被裁剪多边形可以是任意凸多边形或凹多边形,裁剪窗口不局限于矩形,可以是任意凸多边形。
  上面的算法是多边形相对窗口的一条边界进行裁剪的实现,对于窗口的每一条边界依次调用该算法程序,并将前一次裁剪的结果多边形作为下一次裁剪时的被裁剪多边形,即可得到完整的多边形裁剪程序。
//点在有向线段那侧
向量叉积法
  为简单计,测试点表示为P点。假设窗口边界方向为顺时针,如图中所示,对于其中任一边界向量,从向量起点A向终点B看过去:
  如果被测试点P在该边界线右边(即内侧),AB×AP的方向与X-Y平面垂直并指向屏幕里面,即右手坐标系中Z轴的负方向。
  反过来,如果P在该边界线的左边(即外侧),这时AB×AP的方向与X-Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向。
  设:点P(x,y)、点A(xA,yA)、点B(xB,yB),
    向量AB={(xB-xA),(yB-yA)},
    向量AP={(x-xA),(y-yA)},
  那么AB×AP的方向可由下式的符号来确定:
V=(xB-xA)·(y-yA)-(x-xA)·(yB-yA) // V为AB叉乘AP的结果向量中的z分量
  因此,当V≤0时,P在边界线内侧;
    而V&0时,P在边界线外侧。
typedef point
typedef struct
RtP //裁剪窗口边界向量起点
RtP //裁剪窗口边界向量终点
static int _RtInSide(RtVector vector, RtPoint point) // 计算上面的V,vector为裁剪窗口边界向量,point为上面的p点
return (vector.ep.x - vector.sp.x) * (point.y - vector.sp.y) - (vector.ep.y - vector.sp.y) * (point.x - vector.sp.x);
//多边形点必须是顺时针方向
// src保存的是裁剪窗口坐标点,应该是顺时针方向保存,num为裁剪窗口边界数量,*dest保存裁剪后的多边形顶点数组,*total为*dest大小
int rtPrunePSH(RtPoint* src, int num, RtPoint** dest, int* total)
int i = 0, j = 0, k = -1, flag = 0;
RtPoint start,//被剪裁多边形的边向量起点和终点
RtPoint sp,//剪裁窗口边界向量的起点和终点
RtPoint* temp = NULL;
// temp保存针对某一裁剪窗口边界裁剪后的新坐标
temp = (RtPoint*)malloc(sizeof(RtPoint) * 3 * (*total));
if (temp == NULL) return -1;
sp = *(src + num - 1);
for ( i = 0; i & i++)//剪裁窗口
ep = *(src + i);
start = *((*dest) + *total - 1);
flag = _RtInSide(rtVector(sp, ep), start) & 0 ? 0 : 1; //在外侧,flag为0,在内侧时flag为1
for ( j = 0; j & * j++)//被剪裁的多边形
stop = *((*dest) + j);
if (_RtInSide(rtVector(sp, ep), stop) &= 0)//当前第i个顶点是否在边界内侧
if (flag == 0)/*前一个点在外侧吗?*/
flag = 1;/*从外到内的情况,将标志置1,作为下一次循环的前一点标志*/
CRtPoint&double&
CRtPoint&int& st(sp.x, sp.y), et(ep.x, ep.y);
CRtLine&int& v1(st, et);//v1为由窗口边界向量起点sp和终点ep组成的直线
st.SetData(start.x, start.y);
et.SetData(stop.x, stop.y); //v2为由多边形当前边起点start和终点stop组成的直线
CRtLine&int& v2(st, et);
v2.Intersect(v1,point);
//两直线求交运算,交点保存到point数组里面
(temp + k)-&x = point[0];/*将交点放入新多边形*/
(temp + k)-&y = point[1];
*(temp + k) =/*将当前点pi放入新多边形*/
if (0 != flag)/*前一个点在内侧吗?*/
flag = 0;/*从内到外的情况,将标志置1,作为下一次循环的前一点标志*/
CRtPoint&double&
// 同上面一样
CRtPoint&int& st(sp.x, sp.y), et(ep.x, ep.y);
CRtLine&int& v1(st, et);
st.SetData(start.x, start.y);
et.SetData(stop.x, stop.y);
CRtLine&int& v2(st, et);
v2.Intersect(v1,point);
(temp + k)-&x = point[0];/*将交点放入新多边形*/
(temp + k)-&y = point[1];
start =/*将当前点作为下次循环的前一点*/
*total = k + 1; // k+1为一次裁剪后生成的新坐标点的数量
memcpy(*dest, temp, sizeof(RtPoint) * (*total));
转载来源:
没有更多推荐了,
不良信息举报
举报内容:
多边形裁剪一:Sutherland-Hodgman算法
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
Sutherland-Hodgman算法(多边形裁剪)
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!&>&计算机图形学OpenGL、codeblock、多边形裁剪、Sutherland_Hodgman算法
计算机图形学OpenGL、codeblock、多边形裁剪、Sutherland_Hodgman算法
上传大小:218KB
编程实现Cohen-Sutherland线段裁剪算法或者Sutherland-Hodgman多边形裁剪算法
对各种情况进行测试,验证算法实现的完整性
综合评分:5
下载个数:
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有7条
没下载成功
感谢楼主分享
谢谢分享^_^
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
计算机图形学OpenGL、codeblock、多边形裁剪、Sutherland_Hodgman算法
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
计算机图形学OpenGL、codeblock、多边形裁剪、Sutherland_Hodgman算法Sutherland-hodgman_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Sutherland-hodgman
&&计算机图形学 多边形裁剪算法
你可能喜欢拒绝访问 | www.ggdoc.com | 百度云加速
请打开cookies.
此网站 (www.ggdoc.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(41bf7bf56d6e43bf-ua98).
重新安装浏览器,或使用别的浏览器

我要回帖

更多关于 joan sutherland 的文章

 

随机推荐