/// <summary> /// Returns trees to which is possible (probable) to add the pPoint /// </summary> /// <param name="pMerging">pPoint is a peak of a tree and we are not interested in this tree</param> /// <returns></returns> public static List <CTree> GetPossibleTreesFor(Vector3 pPoint, EPossibleTreesMethod pMethod, bool pMerging, CTree pExcludeTree = null) { List <CTree> possibleTrees = new List <CTree>(); if (pMethod == EPossibleTreesMethod.ClosestHigher) { possibleTrees.AddRange(CProjectData.Points.treeNormalArray.GetTreesInMaxStepsFrom(pPoint, MAX_DISTANCE_FOR_POSSIBLE_TREES)); //remove trees that are too far //for(int i = possibleTrees.Count - 1; i >= 0; i--) //{ // if(CUtils.Get2DDistance(pPoint, possibleTrees[i].peak.Center) > MAX_DISTANCE_FOR_POSSIBLE_TREES) // { // possibleTrees.RemoveAt(i); // } //} } else if (pMethod == EPossibleTreesMethod.Contains) { foreach (CTree t in Trees) { if (pExcludeTree != null && pExcludeTree.Equals(t)) { continue; } if (t.Contains(pPoint)) { possibleTrees.Add(t); } } } else if (pMethod == EPossibleTreesMethod.Belongs) { //todo: either optimize or delete throw new Exception("shit code"); //foreach(CTree t in Trees) //{ // if(pExcludeTree != null && pExcludeTree.Equals(t)) // { // continue; // } // if(t.BelongsToTree(pPoint, false)) // { // possibleTrees.Add(t); // t.possibleNewPoint = pPoint; // } //} } //Already sorted in GetTreesInMaxStepsFrom //sort trees by 2D distance of given point to them //possibleTrees.Sort((a, b) => CUtils.Get2DDistance(a.peak.Center, pPoint).CompareTo( // CUtils.Get2DDistance(b.peak.Center, pPoint))); if (pMethod == EPossibleTreesMethod.ClosestHigher) { //CDebug.WriteLine("SELECT FROM " + possibleTrees.Count); List <CTree> closestTrees = new List <CTree>(); //no reason to select more. small chance that point would fit better to further tree const int maxClosestTreesCount = 3; int counter = 0; foreach (CTree possibleTree in possibleTrees) { if (possibleTree.Equals(pExcludeTree)) { continue; } //we dont want trees that are lower than given point if (possibleTree.peak.maxHeight.Z < pPoint.Z) { continue; } closestTrees.Add(possibleTree); counter++; if (counter > maxClosestTreesCount) { break; } } //it can happen that the tree on the very same field as the point is skipped CTree treeOnFieldWithPoint = CProjectData.Points.treeDetailArray.GetFieldContainingPoint(pPoint).GetSingleDetectedTree(); if (treeOnFieldWithPoint != null && treeOnFieldWithPoint != pExcludeTree /*&& * !closestTrees.Contains(treeOnFieldWithPoint)*/) { closestTrees.Insert(0, treeOnFieldWithPoint); } return(closestTrees); } return(possibleTrees); }
private static List <CTree> GetPossibleTreesToMergeWith(CTree pTree, EPossibleTreesMethod pMethod) { return(GetPossibleTreesFor(pTree.peak.Center, pMethod, true, pTree)); }