日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mfc 多边形裁剪算法

發布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 多边形裁剪算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。