private static SubCell GetSubCell(Edge inEdge, double value, ValuesInCell vc) { double lb = vc.LeftBottom; double rb = vc.RightBottom; double rt = vc.RightTop; double lt = vc.LeftTop; SubCell res = SubCell.LeftBottom; switch (inEdge) { case Edge.Left: res = (Math.Abs(value - lb) < Math.Abs(value - lt)) ? SubCell.LeftBottom : SubCell.LeftTop; break; case Edge.Top: res = (Math.Abs(value - lt) < Math.Abs(value - rt)) ? SubCell.LeftTop : SubCell.RightTop; break; case Edge.Right: res = (Math.Abs(value - rb) < Math.Abs(value - rt)) ? SubCell.RightBottom : SubCell.RightTop; break; case Edge.Bottom: default: res = (Math.Abs(value - lb) < Math.Abs(value - rb)) ? SubCell.LeftBottom : SubCell.RightBottom; break; } ValuesInCell subValues = vc.GetSubCell(res); bool valueInside = subValues.ValueBelongTo(value); if (!valueInside) { throw new IsolineGenerationException(Strings.Exceptions.IsolinesDataIsUndetailized); } return(res); }
private Edge GetOutForOpposite(Edge inEdge, CellBitmask cellVal, double value, ValuesInCell cellValues, IrregularCell rect) { Edge outEdge; SubCell subCell = GetSubCell(inEdge, value, cellValues); int iters = 1000; // max number of iterations do { ValuesInCell subValues = cellValues.GetSubCell(subCell); IrregularCell subRect = rect.GetSubRect(subCell); outEdge = GetOutEdge(inEdge, subValues, subRect, value); if (outEdge == Edge.None) { return(Edge.None); } bool isAppropriate = subCell.IsAppropriate(outEdge); if (isAppropriate) { ValuesInCell sValues = subValues.GetSubCell(subCell); Point point = GetPointXY(outEdge, value, subValues, subRect); segments.AddPoint(point); return(outEdge); } else { subCell = GetAdjacentEdge(subCell, outEdge); } byte e = (byte)outEdge; inEdge = (Edge)((e > 2) ? (e >> 2) : (e << 2)); iters--; } while (iters >= 0); throw new IsolineGenerationException(Strings.Exceptions.IsolinesDataIsUndetailized); }