public static void MarkAsNotTree(CTree pTree) { pTree.notTree = true; //to remove references from arrays DeleteTree(pTree); NotTrees.Add(pTree); }
/// <summary> /// If not-tree is very close to some tree then it is probably part of that tree. /// Not-tree will be merged into the closest one. /// </summary> public static void TryMergeNotTrees() { IsMerging = true; DateTime mergeStartTime = DateTime.Now; CDebug.WriteLine("TryMergeNotTrees"); //sort in descending order - trees will be processed from the end NotTrees.Sort((b, a) => b.peak.Center.Z.CompareTo(a.peak.Center.Z)); //TODO: CHECK!!! THIS IS NOT DESCENDING ORDER??? int treeCountBeforeMerge = NotTrees.Count; for (int i = NotTrees.Count - 1; i >= 0; i--) { CTree notTree = NotTrees[i]; //if(notTree.Equals(335)) // CDebug.WriteLine(""); //just debug //List<CTree> closeTrees2 = CProjectData.Points.treeNormalArray. // GetTreesInMaxStepsFrom(notTree.peak.Center, 1); List <CTree> closeTrees = new List <CTree>(); //fisrt try to get a tree on the same detail field CTree t = CProjectData.Points.treeDetailArray. GetFieldContainingPoint(notTree.peak.Center).GetSingleDetectedTree(); if (t != null) { closeTrees.Add(t); } //if no tree is on the same field get some in close distance if (closeTrees.Count == 0) { closeTrees = CProjectData.Points.treeDetailArray. GetTreesInMaxStepsFrom(notTree.peak.Center, 2); } //merge not-tree with the closest tree but only if it is higher. //if not then it is probably some noise above the regular tree if (closeTrees.Count > 0 && closeTrees[0].GetTreeHeight() > notTree.GetTreeHeight() && !notTree.IsLocalMaximum()) { closeTrees[0].MergeWith(notTree); NotTrees.RemoveAt(i); } } IsMerging = false; CDebug.Duration("Not-trees merge", mergeStartTime); CDebug.Count("Number of not-trees merged", treeCountBeforeMerge - Trees.Count); }