计算机图形学常用算法实现8 中点分割裁剪算法

这种方法使用了二分法查找边界,优化了Cohen-Sutherland方法,减小了讨论的数量。
代码中边界范围是200,200到400,400
代码如下:

int encode(Point p)
{
    int code = 0;
    if (p.Y > 400)
        code += 8;
    if (p.Y < 200)
        code += 4;
    if (p.X > 400)
        code += 2;
    if (p.X < 200)
        code += 1;
    return code;
}
//找出p1和p2之间边界的交点
Point findIntersection(Point p1,Point p2)
 {
     Point pmid = new Point();
     pmid.X = (p1.X + p2.X) / 2;
     pmid.Y = (p1.Y + p2.Y) / 2;
     if (distance(pmid, p1) < 1.5)
         return pmid;  
     int code1 = encode(p1);
     int code2 = encode(p2);
     int codemid = encode(pmid);
     if(code1==0)
         if(codemid == 0)
             return findIntersection(pmid, p2);
         else
             return findIntersection(p1, pmid);
     if (code2 == 0)
         if (codemid == 0)
             return findIntersection(pmid, p1);
         else
             return findIntersection(p2, pmid);
     return pmid;
 }
void midLineClip(Point p1,Point p2)
{
   Graphics g = this.CreateGraphics();
   Pen p = new Pen(Brushes.Black);
   int code1 = encode(p1);
   int code2 = encode(p2);
   if ((code1 & code2) != 0)
       return;
   //存在一个点在裁剪框内
   if (code1 == 0 && code2 == 0)
       g.DrawLine(p, p1, p2);
   else
   {
       if (code1 == 0)
           g.DrawLine(p, p1, findIntersection(p1, p2));
       else if (code2 == 0)
           g.DrawLine(p, findIntersection(p1, p2), p2);
       else
       {
           midLineClip(p1,new Point((p1.X+p2.X)/2,(p1.Y+p2.Y)/2));
           midLineClip(new Point((p1.X + p2.X) / 2, (p1.Y + p2.Y) / 2),p2);

       }
   }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值