public void ExecuteSeededGrow(Int16Triple firstseed) { if (buffer == null || seedGrowExecutor == null || dataProvider == null) { throw new Exception(); } queue = new Container_Stack <LayerDataAndInput>(); Layer firstLayer = GetFirstLayer(firstseed); SpanFillInput firstInput = new SpanFillInput (buffer, firstLayer.AllWidth, firstLayer.AllHeight, firstLayer.actualDepth, firstLayer.GetAndInitFlag(), new List <Range>(), ConvertGlobalCoodToLayerCoold(firstLayer, firstseed), firstLayer.HasUpperLayer(), firstLayer.HasLowerLayer(), true); queue.Push(new LayerDataAndInput(firstLayer, firstInput)); while (!queue.Empty()) { LayerDataAndInput sgi = queue.Pop(); Layer layer = sgi.layer; layer.visitcount++; SpanFillInput input = sgi.input; FillLayerData(layer); SpanFillResult ret1 = seedGrowExecutor.ExecuteSeededGrow(input); input.spanlist.Clear(); //ConvertLayerCoordsToGlobalCoords(layer,ret1.resultPointSet); // resultSet.AddRange(ret1.resultPointSet); resultCount += ret1.resultCount; if (ret1.GetNeedsSeekLower()) { Layer lowerlayer = image.GetLayer(layer.indexZ - 1); if (lowerlayer == null) { ret1.boundaryRequestPoints[0].Clear(); continue; } ConvertOtherLayerCoordsToThisLayerCoords(layer, lowerlayer, ret1.boundaryRequestPoints[0]); SpanFillInput newinput = new SpanFillInput (buffer, lowerlayer.AllWidth, lowerlayer.AllHeight, lowerlayer.actualDepth, lowerlayer.GetAndInitFlag(), ret1.boundaryRequestPoints[0], input.seed, lowerlayer.HasUpperLayer(), lowerlayer.HasLowerLayer(), false); queue.Push(new LayerDataAndInput(lowerlayer, newinput)); } if (ret1.GetNeedsSeekUpper()) { Layer upperlayer = image.GetLayer(layer.indexZ + 1); if (upperlayer == null) { ret1.boundaryRequestPoints[1].Clear(); continue; } ConvertOtherLayerCoordsToThisLayerCoords(layer, upperlayer, ret1.boundaryRequestPoints[1]); SpanFillInput newinput = new SpanFillInput (buffer, upperlayer.AllWidth, upperlayer.AllHeight, upperlayer.actualDepth, upperlayer.GetAndInitFlag(), ret1.boundaryRequestPoints[1], input.seed, upperlayer.HasUpperLayer(), upperlayer.HasLowerLayer(), false); queue.Push(new LayerDataAndInput(upperlayer, newinput)); } } }
public LayerDataAndInput(Layer layer, SpanFillInput input) { this.layer = layer; this.input = input; }