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(Properties.Resources.IsolinesDataIsUndetailized); } return(res); }
private Edge GetOutEdge(Edge inEdge, ValuesInCell cv, IrregularCell rect, double value) { // value smaller than all values in corners or // value greater than all values in corners if (!cv.ValueBelongTo(value)) { throw new IsolineGenerationException(Properties.Resources.IsolinesValueIsOutOfCell); } CellBitmask cellVal = cv.GetCellValue(value); var dict = dictChooser[(int)inEdge]; if (dict.ContainsKey((int)cellVal)) { return(dict[(int)cellVal]); } else if (cellVal.IsDiagonal()) { return(GetOutForOpposite(inEdge, cellVal, value, cv, rect)); } const double near_zero = 0.0001; const double near_one = 1 - near_zero; double lt = cv.LeftTop; double rt = cv.RightTop; double rb = cv.RightBottom; double lb = cv.LeftBottom; switch (inEdge) { case Edge.Left: if (value == lt) { value = near_one * lt + near_zero * rt; } else if (value == rt) { value = near_one * rt + near_zero * lt; } else { throw new IsolineGenerationException(Properties.Resources.IsolinesUnsupportedCase); } break; case Edge.Top: if (value == rt) { value = near_one * rt + near_zero * lt; } else if (value == lt) { value = near_one * lt + near_zero * rt; } else { throw new IsolineGenerationException(Properties.Resources.IsolinesUnsupportedCase); } break; case Edge.Right: if (value == rb) { value = near_one * rb + near_zero * rt; } else if (value == rt) { value = near_one * rt + near_zero * rb; } else { throw new IsolineGenerationException(Properties.Resources.IsolinesUnsupportedCase); } break; case Edge.Bottom: if (value == rb) { value = near_one * rb + near_zero * lb; } else if (value == lb) { value = near_one * lb + near_zero * rb; } else { throw new IsolineGenerationException(Properties.Resources.IsolinesUnsupportedCase); } break; } return(GetOutEdge(inEdge, cv, rect, value)); }