mfc 多边形裁剪算法
生活随笔
收集整理的這篇文章主要介紹了
mfc 多边形裁剪算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多邊形裁剪
效果截圖:
1.頭文件定義:
enum Boundary{Left, Right, Bottom, Top};
? ? int cj_line_x1;//裁剪直線時原直線的坐標
?? ?int cj_line_x2;
?? ?int cj_line_y1;
?? ?int cj_line_y2;
? ?CPoint cj_win1;//裁剪窗口坐標,矩形窗口的對角坐標
?? ?CPoint cj_win2;
//多邊形裁剪
?? ?int dbx_count;
? ? CPoint ps[5];//這里以畫五個頂點的多變形為例,而且不必初始化
以上定義的一定要在構造函數里初始化,不然會報錯
具體實現:
//判斷點在裁剪框內外 int CquhongjuanView::Inside(POINT p, Boundary b, POINT wMin, POINT wMax){ switch (b){case Left:if (p.x<wMin.x) return (false);break;case Right:if (p.x>wMax.x) return (false);break;case Bottom:if (p.y<wMin.y) return (false);break;case Top:if (p.y>wMax.y) return (false);break;}return true;}/*Inside*//* 求相交的點 */POINT CquhongjuanView::Intersect(POINT p1, POINT p2, Boundary b, POINT wMin, POINT wMax){POINT iPt;float m;if (p1.x != p2.x) m = (p2.y - p1.y)*1.0 / (p2.x - p1.x);switch (b) {case Left:iPt.x = wMin.x;iPt.y = p2.y + (wMin.x - p2.x)*m;break;case Right:iPt.x = wMax.x;iPt.y = p2.y + (wMax.x - p2.x)*m;break;case Bottom:iPt.y = wMin.y;if (p1.x != p2.x)iPt.x = p2.x + (wMin.y - p2.y) / m;else iPt.x = p2.x;break;case Top:iPt.y = wMax.y;if (p1.x != p2.x) iPt.x = p2.x + (wMax.y - p2.y) / m;else iPt.x = p2.x;break;}return iPt;}/*Intersect*///按邊裁剪int Cquhongjuaniew::edgeCliper(Boundary b, POINT wMin, POINT wMax, POINT *pIn, int cnt, POINT *pOut) {POINT s;int i, Outcnt = 0;s = pIn[0];for (i = 1; i <= cnt; i++){if (!Inside(s, b, wMin, wMax) && Inside(pIn[i], b, wMin, wMax)){pOut[Outcnt] = Intersect(s, pIn[i], b, wMin, wMax);Outcnt++;pOut[Outcnt] = pIn[i];Outcnt++;}else if (Inside(s, b, wMin, wMax) && Inside(pIn[i], b, wMin, wMax)){pOut[Outcnt] = pIn[i];Outcnt++;}else if (Inside(s, b, wMin, wMax) && (!Inside(pIn[i], b, wMin, wMax))){pOut[Outcnt] = Intersect(s, pIn[i], b, wMin, wMax);Outcnt++;}s = pIn[i];}return Outcnt;}/*edgeCliper*//* 多邊形裁剪 */void CquhongjuanView::clipPolygon(CDC * pDC){int i, cnt, Outcnt, b;//多寫了第一個點是為了使得最后一個點與第一個點連起來POINT points[6] = { { ps[0].x,ps[0].y },{ ps[1].x,ps[1].y },{ ps[2].x,ps[2].y },{ ps[3].x,ps[3].y },{ ps[4].x,ps[4].y },{ ps[0].x,ps[0].y} };cnt = 5;POINT pOut[20], pIn[20];POINT wMin = { 100,100 }, wMax = { 300,300 };for (i = 0; i < 4 * cnt; i++){pIn[i].x = 0;pIn[i].y = 0;pOut[i].x = 0;pOut[i].y = 0;}for (i = 0; i <= cnt; i++) pIn[i] = points[i];for (b = 0; b < 4; b++){Outcnt = edgeCliper(Boundary(b), wMin, wMax, pIn, cnt, pOut);for (i = 0; i < Outcnt; i++) pIn[i] = pOut[i];pIn[Outcnt] = pOut[0];cnt = Outcnt;}pDC->Rectangle(wMin.x, wMin.y, wMax.x, wMax.y);pDC->Polygon(pOut, cnt);return;}/* clipPolygon *//* 顯示未裁剪的多邊形和框 */void CquhongjuanView::showUnclipPolygon(CDC * pDC){POINT points[5] = { { ps[0].x,ps[0].y },{ ps[1].x,ps[1].y },{ ps[2].x,ps[2].y },{ ps[3].x,ps[3].y },{ ps[4].x,ps[4].y } };//POINT points[8];POINT wMin = { 100,100 }, wMax = { 300,300 };CBrush * pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);pDC->Rectangle(wMin.x, wMin.y, wMax.x, wMax.y);pDC->Polygon(points, 5);pDC->SelectObject(pOldBrush);}可能有些定義不明確,可以根據上下文語境推測,主要是這個做起來有點煩,就懶得寫了,體諒一下
ps:mfc相關直線、圓、橢圓、多邊形、多邊形填充、裁剪直線可以關注我的博客
總結
以上是生活随笔為你收集整理的mfc 多边形裁剪算法的全部內容,希望文章能夠幫你解決所遇到的問題。