public FinderPatternInfo(FinderPattern[] patternCenters)
 {
     this.bottomLeft = patternCenters[0];
     this.topLeft = patternCenters[1];
     this.topRight = patternCenters[2];
 }
 /// <summary> <p>This is called when a horizontal scan finds a possible alignment pattern. It will
 /// cross check with a vertical scan, and if successful, will, ah, cross-cross-check
 /// with another horizontal scan. This is needed primarily to locate the real horizontal
 /// center of the pattern in cases of extreme skew.</p>
 /// 
 /// <p>If that succeeds the finder pattern location is added to a list that tracks
 /// the number of times each location has been nearly-matched as a finder pattern.
 /// Each additional find is more evidence that the location is in fact a finder
 /// pattern center
 /// 
 /// </summary>
 /// <param name="stateCount">reading state module counts from horizontal scan
 /// </param>
 /// <param name="i">row where finder pattern may be found
 /// </param>
 /// <param name="j">end of possible finder pattern in row
 /// </param>
 /// <returns> true if a finder pattern candidate was found this time
 /// </returns>
 protected internal virtual bool handlePossibleCenter(int[] stateCount, int i, int j)
 {
     int stateCountTotal = stateCount[0] + stateCount[1] + stateCount[2] + stateCount[3] + stateCount[4];
     float centerJ = centerFromEnd(stateCount, j);
     //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
     float centerI = crossCheckVertical(i, (int) centerJ, stateCount[2], stateCountTotal);
     if (!System.Single.IsNaN(centerI))
     {
         // Re-cross check
         //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
         centerJ = crossCheckHorizontal((int) centerJ, (int) centerI, stateCount[2], stateCountTotal);
         if (!System.Single.IsNaN(centerJ))
         {
             //UPGRADE_WARNING: Data types in Visual C# might be different.  Verify the accuracy of narrowing conversions. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1042'"
             float estimatedModuleSize = (float) stateCountTotal / 7.0f;
             bool found = false;
             int max = possibleCenters.Count;
             for (int index = 0; index < max; index++)
             {
                 FinderPattern center = (FinderPattern) possibleCenters[index];
                 // Look for about the same center and module size:
                 if (center.aboutEquals(estimatedModuleSize, centerI, centerJ))
                 {
                     center.incrementCount();
                     found = true;
                     break;
                 }
             }
             if (!found)
             {
                 ResultPoint point = new FinderPattern(centerJ, centerI, estimatedModuleSize);
                 possibleCenters.Add(point);
                 if (resultPointCallback != null)
                 {
                     resultPointCallback.foundPossibleResultPoint(point);
                 }
             }
             return true;
         }
     }
     return false;
 }