1. 程式人生 > >計算機圖形學常用演算法實現7 Cohen-Sutherland裁剪演算法

計算機圖形學常用演算法實現7 Cohen-Sutherland裁剪演算法

在winform下執行
演算法本身的實現不算很難,但是這個演算法的思路很秀,反正我是想不出來。
程式碼中的區域為(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;
}
void lineClip(Point p1,Point p2)
{
    Graphics g = this.CreateGraphics();
    Pen p = new Pen(Brushes.Black);
    int code1 = encode(p1);
    int code2 = encode(p2);
    while (code1 != 0 || code2 != 0)
    {
        //在直線之外,直接捨去,但是跨過三個區域的情況捨棄不了,需要在後面分割一次再分別捨去
        if ((code1 & code2) != 0)
            return;
        //處理大於上界的點
        if ((code1 & 8) != 0)
        {
            p1.X -= (p1.Y - 400) * (p1.X - p2.X) / (p1.Y - p2.Y);
            p1.Y = 400;
            code1 = encode(p1);
        }
        else if ((code2 & 8) != 0)
        {
            p2.X -= (p2.Y - 400) * (p2.X - p1.X) / (p2.Y - p1.Y);
            p2.Y = 400;
            code2 = encode(p2);
        }
        //處理小於下界的點
        else if ((code1 & 4) != 0)
        {
            p1.X -= (p1.Y - 200) * (p1.X - p2.X) / (p1.Y - p2.Y);
            p1.Y = 200;
            code1 = encode(p1);
        }
        else if ((code2 & 4) != 0)
        {
            p2.X -= (p2.Y - 200) * (p2.X - p1.X) / (p2.Y - p1.Y);
            p2.Y = 200;
            code2 = encode(p2);
        }
        //處理大於右界的點
        else if ((code1 & 2) != 0)
        {
            p1.Y -= (p1.X - 400) * (p1.Y - p2.Y) / (p1.X - p2.X);
            p1.X = 400;
            code1 = encode(p1);
        }
        else if ((code2 & 2) != 0)
        {
            p2.Y -= (p2.X - 400) * (p2.Y - p1.Y) / (p2.X - p1.X);
            p2.X = 400;
            code2 = encode(p2);
        }
        //處理小於左邊界的點
        else if ((code1 & 1) != 0)
        {
            p1.Y -= (p1.X - 200) * (p1.Y - p2.Y) / (p1.X - p2.X);
            p1.X = 200;
            code1 = encode(p1);
        }
        else if ((code2 & 1) != 0)
        {
            p2.Y -= (p2.X - 200) * (p2.Y - p1.Y) / (p2.X - p1.X);
            p2.X = 200;
            code2 = encode(p2);
        }
    }
    g.DrawLine(p, p1, p2);
}

在這裡插入圖片描述