因為專案中用到的形狀比較多,雖然像矩形、圓這些形狀演算法面積比較簡單,但如果每種形狀都用程式員去寫演算法,太麻煩了。也不可能全部一一寫出來。
只能用通用的積分求面積演算法。但是怎么通過傳入的polygon通過積分求面積呢?
uj5u.com熱心網友回復:
參考開源OpenCV專案中cvContourArea函式的實作。uj5u.com熱心網友回復:
https://blog.csdn.net/langmanqishizaijia/article/details/51097364uj5u.com熱心網友回復:
可用鞋帶公式求。具體參考:https://blog.csdn.net/yang_deyuan/article/details/78863424uj5u.com熱心網友回復:
我們是用數值積分的辦法做的,所有的引數曲線都可以適用。uj5u.com熱心網友回復:
void CFillTudouDlg::OnButton1()
{
// TODO: Add your control notification handler code here
BOOL start=FALSE;
int end=0;
CDC *pDC=m_Pic.GetDC();
CRect rc;
m_Pic.GetClientRect(rc);
CRgn allRgn,tmpRgn;
allRgn.CreateRectRgn(0,0,0,0);
//
for(int y=0;y < rc.Height();y++)
{
for(int x=0;x < rc.Width();x++)
{
COLORREF col=pDC->GetPixel(x,y);
if((!start) && (col == RGB(0,0,0)))
{// once a line
start=TRUE;
// find end
int e=x;
int repeat=x;
// skip as many as black points
while((pDC->GetPixel(e,y) == RGB(0,0,0)) && (e < rc.Width()))
{
e++;
repeat++;
}
// search end
while((pDC->GetPixel(e,y) != RGB(0,0,0)) && (e < rc.Width()))
{
e++;
}
// if after end ,still black points
while((pDC->GetPixel(e,y) == RGB(0,0,0)) && (e < rc.Width()))
{
e++;
}
// check valid x
if(e == rc.Width())
{// not found
end=repeat;
}
else
{// found
end=e;
}
}// end if((!start) && (col == RGB(0,0,0)))
// add rgn
if(start && (x < end))
{
#if 1 // not use rgn
pDC->SetPixel(x,y,RGB(255,0,0));
#else
tmpRgn.CreateRectRgn(x,y,x+1,y+1);
allRgn.CombineRgn(&allRgn,&tmpRgn,RGN_OR);
tmpRgn.DeleteObject();
#endif
}
}// end for x
// reset flag
start=FALSE;
}// end for y
#if 0
//draw rgn
CBrush br;
br.CreateSolidBrush(RGB(255,0,0));
pDC->FillRgn(&allRgn,&br);
ReleaseDC(pDC);
#endif
}
記錄 pDC->SetPixel(x,y,RGB(255,0,0)); 的點數就是 面積
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/12040.html
標籤:圖形處理/算法
下一篇:三次樣條插值問題
