假設有一不規則多邊型他有n個點(X[1],Y[1]),(X[2],Y[2])...(X[n],Y[n]).先找出Y最小的那點,假設那點為Xbase,Ybase,負面積(在多邊行外的面積)計算如下:

2011_08_25_002.bmp   


負面積正面積的判斷方式:X[i]由漸大變為漸小或由漸小變為漸大,就是正負面積的切換.

2011_08_25_004.bmp   

 

正負面積切換如下,面積就等於正面積減掉負面積.

2011_08_25_005.bmp  


但一開始假設的負面積在下列情況下有可能是錯的!

2011_08_25_007.bmp

但這也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;
}

arrow
arrow
    全站熱搜

    peter27863043 發表在 痞客邦 留言(0) 人氣()