Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
 private static List <CTree> GetPossibleTreesToMergeWith(CTree pTree, EPossibleTreesMethod pMethod)
 {
     return(GetPossibleTreesFor(pTree.peak.Center, pMethod, true, pTree));
 }