Beispiel #1
0
        // 计算角尺度
        public void Uniform_Angle_Index()
        {
            for (int i = 0; i < forest.Count; i++)
            {
                int count = 0;

                //计算周围木方位角
                List <indivTree> trees = new List <indivTree>();
                indivTree        iTree = new indivTree();

                for (int j = 0; j < 4; j++)
                {
                    if (units[i].quad[j] == 1)
                    {
                        double angle = Math.Atan((forest[units[i].id[j]].Y - forest[i].Y) / (forest[units[i].id[j]].X - forest[i].X));
                        iTree.azimuth  = angle;
                        iTree.id       = units[i].id[j];
                        iTree.quadrant = 1;
                        trees.Add(iTree);
                    }
                    else if (units[i].quad[j] == 2)
                    {
                        double angle = Math.Atan((forest[units[i].id[j]].Y - forest[i].Y) / (forest[i].X - forest[units[i].id[j]].X));
                        iTree.azimuth  = Math.PI - angle;
                        iTree.id       = units[i].id[j];
                        iTree.quadrant = 2;
                        trees.Add(iTree);
                    }
                    else if (units[i].quad[j] == 3)
                    {
                        double angle = Math.Atan((forest[i].Y - forest[units[i].id[j]].Y) / (forest[i].X - forest[units[i].id[j]].X));
                        iTree.azimuth  = angle + Math.PI;
                        iTree.id       = units[i].id[j];
                        iTree.quadrant = 3;
                        trees.Add(iTree);
                    }
                    else if (units[i].quad[j] == 4)
                    {
                        double angle = Math.Atan((forest[i].Y - forest[units[i].id[j]].Y) / (forest[units[i].id[j]].X - forest[i].X));
                        iTree.azimuth  = Math.PI * 2 - angle;
                        iTree.id       = units[i].id[j];
                        iTree.quadrant = 4;
                        trees.Add(iTree);
                    }
                }

                //按方位角排序,升序
                trees.Sort((left, right) => left.azimuth.CompareTo(right.azimuth));

                //计算夹角
                double inAngle1 = trees[1].azimuth - trees[0].azimuth;
                double inAngle2 = trees[2].azimuth - trees[1].azimuth;
                double inAngle3 = trees[3].azimuth - trees[2].azimuth;
                double inAngle4 = trees[0].azimuth + Math.PI * 2 - trees[1].azimuth;

                if (inAngle1 < Math.PI / 2)
                {
                    count++;
                }
                else if (inAngle2 < Math.PI / 2)
                {
                    count++;
                }
                else if (inAngle3 < Math.PI / 2)
                {
                    count++;
                }
                else if (inAngle4 < Math.PI / 2)
                {
                    count++;
                }

                uai.Add(count / 4.0);
            }
        }
Beispiel #2
0
        public List <int> edgeTree         = new List <int>(); //边界木

        /// <summary>
        /// 划分空间结构单元
        /// </summary>
        public void DivideUnit(List <Tree> array)
        {
            //清理空间结构单元
            near4Units.Clear();
            allUnits.Clear();
            edgeTree.Clear();

            //for (int i = 0; i < array.Count; i++)
            ParallelLoopResult parallelresult = Parallel.For(0, array.Count, i =>
            {
                List <indivTree> TreeInForest = new List <indivTree>();
                List <indivTree> near4trees   = new List <indivTree>();      //最近四株木
                List <indivTree> ssUnit       = new List <indivTree>();      //空间结构单元

                for (int j = 0; j < array.Count; j++)
                {
                    indivTree iTree = new indivTree();

                    if (i != j)
                    {
                        //id
                        iTree.centerID = i;
                        iTree.id       = j;

                        //计算距离
                        double distance = Math.Sqrt((array[i].X - array[j].X) * (array[i].X - array[j].X) + (array[i].Y - array[j].Y) * (array[i].Y - array[j].Y));
                        iTree.distance  = distance;

                        //确定象限
                        double x_ = array[j].X - array[i].X;
                        double y_ = array[j].Y - array[i].Y;

                        if (x_ > 0 && y_ >= 0)
                        {
                            iTree.quadrant = 1;
                        }
                        else if (x_ >= 0 && y_ < 0)
                        {
                            iTree.quadrant = 4;
                        }
                        else if (x_ < 0 && y_ <= 0)
                        {
                            iTree.quadrant = 3;
                        }
                        else if (x_ <= 0 && y_ > 0)
                        {
                            iTree.quadrant = 2;
                        }
                        else
                        {
                            Console.WriteLine("Abnormality of tree position... Tree ID: " + i);
                            return;
                        }

                        TreeInForest.Add(iTree);
                    }
                }

                //对树木按距离进行排序
                TreeInForest.Sort((left, right) => left.distance.CompareTo(right.distance));
                //{
                //    if (left.distance > right.distance)
                //        return 1;
                //    else if (left.distance == right.distance)
                //        return 0;
                //    else
                //        return -1;
                //});

                //最近四株木
                for (int j = 0; j < 4; j++)
                {
                    near4trees.Add(TreeInForest[j]);
                }

                //全象限空间结构单元
                int lackQuad;
                ssUnit = near4trees;
                if (!quadContained(1, ssUnit))
                {
                    int treeCount;
                    lackQuad = 1;
                    for (treeCount = 4; treeCount < TreeInForest.Count; treeCount++)
                    {
                        if (TreeInForest[treeCount].quadrant == lackQuad)
                        {
                            ssUnit.Add(TreeInForest[treeCount]);
                            break;
                        }
                    }
                    if (treeCount >= TreeInForest.Count)
                    {
                        edgeTree.Add(i);
                    }
                }
                if (!quadContained(2, ssUnit))
                {
                    int treeCount;
                    lackQuad = 2;
                    for (treeCount = 4; treeCount < TreeInForest.Count; treeCount++)
                    {
                        if (TreeInForest[treeCount].quadrant == lackQuad)
                        {
                            ssUnit.Add(TreeInForest[treeCount]);
                            break;
                        }
                    }

                    if (treeCount >= TreeInForest.Count)
                    {
                        edgeTree.Add(i);
                    }
                }
                if (!quadContained(3, ssUnit))
                {
                    int treeCount;
                    lackQuad = 3;
                    for (treeCount = 4; treeCount < TreeInForest.Count; treeCount++)
                    {
                        if (TreeInForest[treeCount].quadrant == lackQuad)
                        {
                            ssUnit.Add(TreeInForest[treeCount]);
                            break;
                        }
                    }

                    if (treeCount >= TreeInForest.Count)
                    {
                        edgeTree.Add(i);
                    }
                }
                if (!quadContained(4, ssUnit))
                {
                    int treeCount;
                    lackQuad = 4;
                    for (treeCount = 4; treeCount < TreeInForest.Count; treeCount++)
                    {
                        if (TreeInForest[treeCount].quadrant == lackQuad)
                        {
                            ssUnit.Add(TreeInForest[treeCount]);
                            break;
                        }
                    }

                    if (treeCount >= TreeInForest.Count)
                    {
                        edgeTree.Add(i);
                    }
                }

                //保存所有惠氏空间结构单元
                unit_tree ut;
                ut.centerID = i;
                ut.id       = new List <int>();
                ut.quad     = new List <int>();

                for (int j = 0; j < 4; j++)
                {
                    ut.id.Add(ssUnit[j].id);
                    ut.quad.Add(ssUnit[j].quadrant);
                }
                lock (near4Units)
                {
                    near4Units.Add(ut);
                }

                //保存所有全象限空间结构单元
                ut.id.Clear();
                ut.quad.Clear();
                for (int j = 0; j < ssUnit.Count; j++)
                {
                    ut.id.Add(ssUnit[j].id);
                    ut.quad.Add(ssUnit[j].quadrant);
                }
                lock (allUnits)
                {
                    allUnits.Add(ut);
                }
            });
        }