假設有一不規則多邊型他有n個點(X[1],Y[1]),(X[2],Y[2])...(X[n],Y[n]).先找出Y最小的那點,假設那點為Xbase,Ybase,負面積(在多邊行外的面積)計算如下:
負面積正面積的判斷方式:X[i]由漸大變為漸小或由漸小變為漸大,就是正負面積的切換.
正負面積切換如下,面積就等於正面積減掉負面積.
但一開始假設的負面積在下列情況下有可能是錯的!
但這也ok因為如果錯誤那答案是負的只要把負號去掉就可以了!
void CColoAnalysisDlg::CheckAreaSize(double *pdbx1,double *pdby1,int wHcount,
double *pdbMinusArea,
double *pdbPlusArea)
{
double dbBaseX,dbBaseY,dbBaseHue;
BOOL MinusON=TRUE;
int XDirection=1;
double dbMinusArea=0;
double dbPlusArea=0;
double TriangleArea,RrectangleArea;
double dbN1x,dbN1y,dbN2x,dbN2y;
double MinusArea=0;
double PlusArea=0;
int i,HueCount;
HueCount=wHcount;
dbBaseX=1;
dbBaseY=1;
for(i=0;i<HueCount;i++)
{
if(pdby1[i]<dbBaseY)
{
dbBaseY=pdby1[i];
dbBaseX=pdbx1[i];
dbBaseHue=i;
}
}
for(i=dbBaseHue;i<HueCount;i++)
{
dbN1x=pdbx1[i];
dbN1y=pdby1[i];
if(i==(HueCount-1))
{
dbN2x=pdbx1[0];
dbN2y=pdby1[0];
}
else
{
dbN2x=pdbx1[i+1];
dbN2y=pdby1[i+1];
}
TriangleArea=(fabs(dbN1x-dbN2x)*fabs(dbN1y-dbN2y))/2;
RrectangleArea=0;
if ((dbBaseY!=dbN1y) && (dbBaseY!=dbN2y))
{
if (dbN1y<=dbN2y)
RrectangleArea= (dbN1y-dbBaseY)*fabs(dbN1x-dbN2x);
else
RrectangleArea= (dbN2y-dbBaseY)*fabs(dbN1x-dbN2x);
}
if(XDirection==1)
{
if(dbN2x>=dbN1x)
MinusArea= MinusArea +RrectangleArea+ TriangleArea;
else
{
PlusArea= PlusArea +RrectangleArea+ TriangleArea;
XDirection=0;
}
}
else if(XDirection==0)
{
if(dbN2x<=dbN1x)
PlusArea= PlusArea +RrectangleArea+ TriangleArea;
else
{
MinusArea= MinusArea +RrectangleArea+ TriangleArea;
XDirection=1;
}
}
}
if(dbBaseHue!=0)
{
for(i=0;i<dbBaseHue;i++)
{
dbN1x=pdbx1[i];
dbN1y=pdby1[i];
if(i==(HueCount-1))
{
dbN2x=pdbx1[0];
dbN2y=pdby1[0];
}
else
{
dbN2x=pdbx1[i+1];
dbN2y=pdby1[i+1];
}
TriangleArea=(fabs(dbN1x-dbN2x)*fabs(dbN1y-dbN2y))/2;
RrectangleArea=0;
if ((dbBaseY!=dbN1y) && (dbBaseY!=dbN2y))
{
if (dbN1y<=dbN2y)
RrectangleArea= (dbN1y-dbBaseY)*fabs(dbN1x-dbN2x);
else
RrectangleArea= (dbN2y-dbBaseY)*fabs(dbN1x-dbN2x);
}
if(XDirection==1)
{
if(dbN2x>=dbN1x)
MinusArea= MinusArea +RrectangleArea+ TriangleArea;
else
{
PlusArea= PlusArea +RrectangleArea+ TriangleArea;
XDirection=0;
}
}
else if(XDirection==0)
{
if(dbN2x<=dbN1x)
PlusArea= PlusArea +RrectangleArea+ TriangleArea;
else
{
MinusArea= MinusArea +RrectangleArea+ TriangleArea;
XDirection=1;
}
}
}
}
*pdbMinusArea=MinusArea;
*pdbPlusArea=PlusArea;
}