热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#求点集的最小包围矩形

这篇文章主要为大家详细介绍了C#求点集的最小包围矩形,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C# 求点集的最小包围矩形,供大家参考,具体内容如下

思路:

1、求点集的中心点
2、将点集绕矩形进行一系列角度的旋转,并求记录旋转点集的包围矩形的面积和旋转角度;
3、将面积最小的矩形绕点集中心点旋转回去。

 // 1.寻找多边形的中心 
  public XYZ GetCenter(List pts)
  {
   double sumx = 0;
   double sumy = 0;
   foreach (var p in pts)
   {
    sumx = sumx + p.X;
    sumy = sumy + p.Y;
   }
   var pt = new XYZ(sumx/pts.Count(),sumy/pts.Count(),0);
   return pt;
  }

  // 2.旋转多边形,针对每个点实现绕中心点旋转

  public XYZ RotatePt(XYZ inpt ,XYZ centerPt ,double theta)
  {
   double ix = inpt.X;
   double iy = inpt.Y;
   double cx = centerPt.X;
   double cy = centerPt.Y;
   double Q = theta / 180 * 3.1415926; //角度

   double ox, oy;
   ox = (ix - cx) * Math.Cos(Q) - (iy - cy) * Math.Sin(Q) + cx; //旋转公式
   oy = (ix - cx) * Math.Sin(Q) + (iy - cy) * Math.Cos(Q) + cy;

   var outpt = new XYZ(ox,oy,0);
   return outpt;
  }

  // 3.多边形旋转后求简单外接矩形

  public List GetRect(List inpts)
  {
   var outpts =new List();
   int size = inpts.Count();
   if (size == 0)
    return null;
   else
   {
    var tempx = new List();
    var tempy = new List();
    for (int i = 0; i  boundary { get;set;}
   public XYZ center { get; set; }
   public double theta { get; set; }
   public double area { get; set; }

  }

  public RectData GetRotateRectDatas(List inpts, double theta)
  {
   
   XYZ center = GetCenter(inpts);
   var tempvertices = new List();
   for (int i=0; i vertices = GetRect(tempvertices);
   double deltaX, deltaY;      //求每个外接矩形的面积
   deltaX = vertices[0].X - vertices[2].X;
   deltaY = vertices[0].Y - vertices[2].Y;

   var polygen = new RectData
   {
    area=Math.Abs(deltaY * deltaX),
    center= center,
    theta = theta,
    boundary= vertices
   };
   return polygen;
  }

  //获取所有新的矩形
  public List GetAllNewRectDatas(List inpts)
  {
   var polygens =new List();

   for (int theta = 0; theta <= 90;)
   {
    polygens.Add(GetRotateRectDatas(inpts, theta));
    theta = theta + 5;
   }
   return polygens;
  }
  //获取新的矩形
  public RectData GetMinAreaRect(List polygons)
  {

   double minarea = 100000000;
   int N =0;
   for ( int i=0; i polygons[i].area)
    {
     minarea = polygons[i].area;
     N = i;
    }
   }
   var polygon = new RectData();
   polygon = polygons[N];

   //旋转到最小面积的方向
   XYZ centerPt = GetCenter(polygon.boundary);
   var boundary = new List();
   foreach(var bound in polygon.boundary)
   {
    XYZ pt = RotatePt(bound, polygon.center, -polygon.theta);
    boundary.Add(pt);
   }
   var outpolygon = new RectData
   {
    center= polygon.center,
    area = polygon.area,
    theta = polygon.theta,
    boundary = boundary
   };
   return outpolygon;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 一个C# 泛形红黑树实现
    看了一下算法导论,纸上得来终觉浅,绝知此事要躬行,所以把感兴趣的算法就写了下。红黑树在插入,删除,查找过程中都 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 本文主要介绍关于人工智能,shell的知识点,对【winyyy.sys,hcpidesk.sys,mtlrd.sys,uldfhjfh.sys,servets.exe等1】和【】有兴趣的朋友可以看下由 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了2D阵列选择排序相关的知识,希望对你有一定的参考价值。所以 ... [详细]
  • [更新幻灯]1剔除“伪创新”和“无领域”的领域驱动设计
    如果有人不了解人体的内部结构,就自称医生,声称自己能给人开腹割掉发炎的阑尾,甚至还能开胸给冠心病人做心脏搭桥,你信吗 ... [详细]
  • html+css网页设计源码_11个Html和CSS 动态网页背景免费代码案例
    html+css网页设计源码_11个Html和CSS 动态网页背景免费代码案例 ... [详细]
  • 这道题做的真的是心碎了,虽然最后也没有靠自己的代码AC,还是靠着别人的代码AC的真的是太菜了附上AC代码,(不是我自己写的)#include<cstdio>#inc ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 06CubeMx+Keil+Proteus仿真STM32
    本文例子参考《STM32单片机开发实例——基于Proteus虚拟仿真与HALLL库》源代码:https:github.comLanLinnetSTM33F103R6 ... [详细]
  • CAS的底层剖析
    CAS1、什么是CAS?CAS:又叫campareandsetSwapExchange,自旋锁。再增加一个知识点:悲观锁:认为该操作会被别的线程打断;乐观锁:认为该操作不会被别的线 ... [详细]
author-avatar
赢在青春创业团队
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有