visual studio2019實現交互式繪制多邊形
這個實驗······在網上找不到。孔令德的實驗代碼下載下來有密碼,暴力破解沒希望,只能自己寫了。
這個和實驗二是緊密相連的。
實驗實現的目標
在屏幕上點擊一個點,松開移動鼠標,線就會跟着鼠標進行延長,再次點擊就會形成新的點,兩點之間形成線段,然后新的線繼續跟着鼠標跑。
當鼠標經過起點的時候,直線自動連到起點,形成閉合多邊形,並且完成顏色的填充。
所以相對實驗二,我們要實現直線的動態顯示(橡皮筋繪制技術)和填充多邊形。其中填充多邊形用到了雙緩沖機制,避免繪圖的過渡(瞬間上色)。
橡皮筋技術和用戶交互
直線在鼠標的移動下像橡皮筋那樣拉伸,就是橡皮筋技術。實現這個技術同樣需要雙緩沖機制。
下面的代碼是網上找來的。來源
int isPress=0;
CPoint start;
CPoint end;
//將上述代碼放在***View.cpp里面的開頭部分(只要能在***View.cpp里面起控制全局的作用就行,例如放在#endif后面)
//在***View.cpp里面用添加類向導將單擊鼠標左鍵,鼠標移動映射為相應的函數。並且添加以下代碼
void CXiangpijinView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
isPress=1;
start=point;
end=start;
CView::OnLButtonDown(nFlags, point);
}
void CXiangpijinView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=this->GetWindowDC();
if (isPress)
{
pDC->SetROP2(R2_NOT);
pDC->MoveTo(start);
pDC->LineTo(end);
pDC->MoveTo(start);
pDC->LineTo(point);
end=point;
}
CView::OnMouseMove(nFlags, point);
}
以上代碼實現了畫線的橡皮筋功能,效果類似於實驗二,但是是系統調用的方法。
實現繪制多邊形
可以在屏幕上畫線了,就要繪制多邊形。
當鼠標左擊一次,就創建一個點,鼠標移動顯示橡皮筋拉伸的線。再次點擊,生成第二個點,線段生成,並生成新的橡皮筋線。
我們需要保存畫的點和線。
//在view.h中建立一個CPoint
CPoint point[100];
如果要保存邊,就要創建新的類,AET和Bucket類
雖然孔令德的實驗代碼沒辦法得到,但是他的課本課后習題的代碼在網上有,其中就有“多邊形有效邊表填充算法”的實驗,里面實現了AET和Bucket
文件我就不發出來了,最后看我的代碼就可以。
使用AET和Bucket保存邊,並且進行填充。
最后實現畫圖的功能,vs2019工程文件,代碼不方便一一展示,就放在后面供大家下載參考吧。
程序剛啟動的時候不要着急點,等待程序加載,不然你會發現點不出直線。
左鍵用來畫線,右鍵用來繪制,切記!!