Beispiel #1
0
        /// <summary>
        /// 重新设置对应的Region,根据拐点的情况
        /// </summary>
        /// <param name="referenceSpan"></param>
        /// <param name="borderDirection"></param>
        /// <param name="cornerDirection"></param>
        /// <returns></returns>
        private int selectedRegionID(OpenHeightSpan referenceSpan,
                                     int borderDirection,
                                     int cornerDirection)
        {
            referenceSpan.getDetailedRegionMap(ref mwNeighborRegions, 0);

            /*
             * Initial example state:
             *
             * a - Known region.
             * x - Null region.
             * u - Unknown, not checked yet.
             *
             *     u u u
             *     u a x
             *     u a a
             */

            int antiBorderDirection = NMGenUtility.AntiDir(borderDirection);
            int antiCornerDirection = NMGenUtility.AntiDir(cornerDirection);
            int regionID            = mwNeighborRegions[antiBorderDirection];

            if (regionID == referenceSpan.regionID() ||
                NULL_REGION == regionID)
            {
                /*
                 * The region away from the border is either a null region
                 * or the same region.  So we keep the current region.
                 *
                 *     u u u      u u u
                 *     a a x  or  x a x  <-- Potentially bad, but stuck with it.
                 *     u a a      u a a
                 */
                return(referenceSpan.regionID());
            }

            int potentialRegion = regionID;

            regionID = mwNeighborRegions[antiCornerDirection];
            if (regionID == referenceSpan.regionID() ||
                NULL_REGION == regionID)
            {
                /*
                 * The region opposite from the corner direction is
                 * either a null region or the same region.  So we
                 * keep the current region.
                 *
                 *     u a u      u x u
                 *     b a x  or  b a x
                 *     u a a      u a a
                 */
                return(referenceSpan.regionID());
            }

            int potentialCount = 0;
            int currentCount   = 0;

            for (int i = 0; i < 8; ++i)
            {
                if (mwNeighborRegions[i] == referenceSpan.regionID())
                {
                    currentCount++;
                }
                else if (mwNeighborRegions[i] == potentialRegion)
                {
                    potentialCount++;
                }
            }

            return(potentialCount < currentCount
                ? referenceSpan.regionID()
                : potentialRegion);
        }