任意多点按某一方向排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
List<PointF> SortPoints(PointF[] points)
{
  List<PointF> result = new List<PointF>();
  PointF center = GetGravityPoint(points.ToList());
  PointF x = new PointF(center.X+1, center.Y);
  PointF OX = new PointF(1,0);
  double OX_len = 1;
 
  List<double>  angle = new List<double>();
 
  foreach (PointF point in points)
  {
    PointF tmpO = new PointF(point.X-center.X,point.Y-center.Y);
    double tmp_len = Math.Sqrt((point.X - center.X)*(point.X - center.X)+(point.Y - center.Y)*(point.Y - center.Y));
    angle.Add(Math.Asin((tmpO.X)/tmp_len));
  }
  List<double>  tmpAngle = new List<double>(angle);
  tmpAngle.Sort();
  List<double> doubles = new List<double>();
  for(int i = 0;i< tmpAngle.Count;i++)
  {
    double tmp = tmpAngle[i];
    int v = angle.FindIndex(item => item.Equals(tmp));
    result.Add(points[v]);
  }    
 
  return result;
}
private PointF GetGravityPoint(List<PointF> lstPol)
{
 
  double n, i;
  double x1, y1, x2, y2, x3, y3;
  double sum_x = 0, sum_y = 0, sum_s = 0;
 
  x1 = lstPol[0].X;
  y1 = lstPol[0].Y;
  x2 = lstPol[1].X;
  y2 = lstPol[1].Y;
 
  n = lstPol.Count;
  int k = 2;
  for (i = 1; i <= n - 2; i++)
  {
    x3 = lstPol[k].X;
    y3 = lstPol[k].Y;
    double s = ((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1)) / 2.0;
    sum_x += (x1 + x2 + x3) * s;
    sum_y += (y1 + y2 + y3) * s;
    sum_s += s;
    x2 = x3;
    y2 = y3;
    k++;
  }
  PointF center = PointF.Empty;
  center.X = Convert.ToSingle(sum_x / sum_s / 3.0);
  center.Y = Convert.ToSingle(sum_y / sum_s / 3.0);
  //MessageBox.Show("("+center.X.ToString()+","+center.Y.ToString()+")");
  return center;
}

  

posted @   echo-efun  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示