public void addNewCurtainUnitWithZNegStartAt(int woco_z) { ZCurtainUnit zcu = new ZCurtainUnit(woco_z); // greater than end if (woco_z > this.worldEndZ) { sections.Add(zcu); return; } if (woco_z < this.worldStartZ) { sections.Insert(0, zcu); return; } int insert_at = 0; //check contiains for (int i = 0; i < sections.Count; ++i) { ZCurtainUnit _zcu = sections[i]; if (_zcu.zRange.contains(woco_z)) { throw new Exception("trying to add a woco z that we already contain..."); } if (_zcu.zRange.start < woco_z) { if (i == 0) { throw new Exception("confusing: why did we get here then (adding new curtain unit..)"); } insert_at = i - 1; break; } } sections.Insert(insert_at, zcu); }
public ZCurtain(int woco_z_start) { ZCurtainUnit first = new ZCurtainUnit(woco_z_start); sections.Add(first); }
public ZCurtainUnit(int z_start, bool startOpen) { this = new ZCurtainUnit(new SimpleRange(z_start, 1), startOpen, false); }
private void extendCurtainToIncludeWocoZ(int woco_z, bool extendInZPosForMiddle, Range1D adjacentSurfaceContinuityZPosNeg, Range1D airRange, bool setTerminalStatus) { // greater than end if (woco_z >= this.worldEndZ) { ZCurtainUnit lastcu = sections[sections.Count - 1]; lastcu.zRange = lastcu.zRange.extendRangeToInclude(woco_z); sections[sections.Count - 1] = lastcu; if (setTerminalStatus) { setDiscontinuityEndWithSurfaceRange(adjacentSurfaceContinuityZPosNeg, airRange); } return; } if (woco_z <= this.worldStartZ) { ZCurtainUnit firstcu = sections[0]; firstcu.zRange = firstcu.zRange.extendRangeToInclude(woco_z); sections[0] = firstcu; if (setTerminalStatus) { setDiscontinuityStartWithSurfaceRange(adjacentSurfaceContinuityZPosNeg, airRange); } return; } if (sections.Count == 1) { ZCurtainUnit zcu = sections[0]; if (zcu.zRange.contains(woco_z)) { return; } } if (sections.Count < 2) { return; } // can't be anthing more to do! // Between ranges // now we need bool extend in z pos SimpleRange zRange; SimpleRange nextZRange; bool combineWithNext = false; int i = 0; ZCurtainUnit zcurtain_unit; ZCurtainUnit nextZCurtain_unit; for (; i < sections.Count - 1; ++i) { zcurtain_unit = sections[i]; nextZCurtain_unit = sections[i + 1]; zRange = zcurtain_unit.zRange; nextZRange = nextZCurtain_unit.zRange; if (zRange.contains(woco_z)) { return; } if (zRange.extent() <= woco_z && nextZRange.start > woco_z) { if (extendInZPosForMiddle) { zRange = SimpleRange.SimpleRangeWithStartAndExtent(zRange.start, woco_z + 1); } else { nextZRange = SimpleRange.SimpleRangeWithStartAndExtent(woco_z, nextZRange.extent()); } //connected up now? if (zRange.extent() == nextZRange.start) { zRange.range += nextZRange.range; zcurtain_unit.endIsOpen = nextZCurtain_unit.endIsOpen; sections.RemoveAt(i + 1); // remove next } else { nextZCurtain_unit.zRange = nextZRange; sections[i + 1] = nextZCurtain_unit; } zcurtain_unit.zRange = zRange; sections[i] = zcurtain_unit; break; } } }