首页 > 其他分享 >任意多点按某一方向排序

任意多点按某一方向排序

时间:2023-12-22 15:12:32浏览次数:35  
标签:center PointF point List 多点 lstPol new 排序 任意

    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;
    }

  

标签:center,PointF,point,List,多点,lstPol,new,排序,任意
From: https://www.cnblogs.com/echo-efun/p/17921621.html

相关文章

  • java8实现分组、排序
    1、用户对象@Getter@Setter@AllArgsConstructorpublicclassUserTest{//名称privateStringuserName;//年龄privatestringage;//分数(这个无所谓啊)privatedoublescore;}2、准备数据List<UserTest>userList=newArrayList<>();......
  • WPF中通过附加属性实现任意控件拖动调整大小
    publicclassResizeBehavior{//附加属性用于标识控件是否可调整大小publicstaticreadonlyDependencyPropertyIsResizableProperty=DependencyProperty.RegisterAttached("IsResizable",typeof(bool),typeof(ResizeBehavior),newP......
  • pythoy排序不支持原生比较的对象
    问题你想排序类型相同的对象,但是他们不支持原生的比较操作。解决方案内置的sorted()函数有一个关键字参数key,可以传入一个callable对象给它,这个callable对象对每个传入的对象返回一个值,这个值会被sorted用来排序这些对象。比如,如果你在应用程序里面有一个User实例......
  • 【洛谷 P1093】[NOIP2007 普及组] 奖学金 题解(结构体排序)
    [NOIP2007普及组]奖学金题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前名学生发奖学金。期末,每个学生都有门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规......
  • 排序
    排序快排,归并排序之前已经熟悉不再赘述计数排序复杂度O(n+m)计数排序适于值域范围较小的数字排序,核心思想:每个数字出现几次统计完每个元素出现次数后,求一边前缀和,就知道了每个数字排完序后的序列中出席拿的为止的范围(第几小到第几小都是这个数字)把数字填入相应为止保......
  • java Page 实现根据字段名排序
    /***排序JSON格式*/@ApiModelProperty(value="排序JSON格式")privateStringorderBy;  @GetMapping("/page_manage")@ApiModelProperty(value="管理端用户管理分页",notes="管理端用户管理分页")publicRpageManage(Page<SysUser>page,......
  • 排序算法详解 C# 版
    概述一般使用的八大排序算法是:插入排序、选择排序、冒泡排序、希尔排序、归并排序、快速排序、堆排序、基数排序,每个方法有其适合的使用场景,可以根据具体数据进行选择.冒泡排序//冒泡排序,比较相临两个数的大小,如lst[i]>lst[i+1],则互换位置staticint[]Bu......
  • 6-4 快速排序
    本题要求实现快速排序的一趟划分函数,待排序列的长度1<=n<=1000。函数接口定义: intPartition(SqListL,intlow,inthigh);其中L是待排序表,使排序后的数据从小到大排列。###类型定义: typedefintKeyType;typedefstruct{KeyType......
  • 使用汇编和反汇编引擎写一个x86任意地址hook
    最简单的Hook刚开始学的时候,用的hook都是最基础的5字节hook,也不会使用hook框架,hook流程如下:构建一个jmp指令跳转到你的函数(函数需定义为裸函数)保存被hook地址的至少5字节机器码,然后写入构建的jmp指令接着在你的代码里做你想要的操作以内联汇编的形式执行被hook地址5字节机......
  • python之列表的排序、循环、合并
    排序:sorted()显示临时排序cars=['byd','audi','gelly','qirui','chengcheng']print(sorted(cars))print(cars)结果:['audi','byd','chengcheng','gelly','qirui'][�......