// 计算角尺度 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); } }
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); } }); }