/// <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); }