計算機圖形學常用演算法實現7 Cohen-Sutherland裁剪演算法
阿新 • • 發佈:2019-01-01
在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); }