計算機圖形學常用演算法實現8 中點分割裁剪演算法
阿新 • • 發佈:2019-01-01
這種方法使用了二分法查詢邊界,優化了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); } } }