多边形离散化函数思想:

1.给定一个离散化单位步长,按步长进行离散

2如果是线段,则直接存到容器中,如果是弧,则离散化以后存到容器中

3返回的是一个二维容器,该容器包含了离散化处理以后多边形按顺序排列的所有的边,二维容器中每一个容器都存贮一条线段或者一段弧离散化以后的一堆小边,故如果原来就是线段,则容器长度就是1,如果原来是弧线则长度不为1.这样的一堆容器再存到一个容器中,构成二维容器,其实可以不用这么写,只不过我项目背景用起来比较方便,各位看懂后自行修改

new_polygon polygon_Discretization(double unit , polygon t_poly)//参数unit是离散的步长,人为指定
{new_polygon poly;vector<vector<seg_curve>>segandcur;vector<seg_curve> segcurves;//建立一个线段容器,用来统一接收一个多边形的所有线段for (int j = 0; j < t_poly.m_polygonPath.size(); j++){    if (t_poly.m_polygonPath[j].m_type == "curve"){/*polygons[i].m_polygonPath.size() = polygons[i].m_polygonPath.size()+n;*/Curve cur;cur.m_xb = t_poly.m_polygonPath[j].m_xs;cur.m_yb = t_poly.m_polygonPath[j].m_ys;cur.m_xe= t_poly.m_polygonPath[j].m_xe;cur.m_ye= t_poly.m_polygonPath[j].m_ye;cur.m_xc = t_poly.m_polygonPath[j].m_xc;cur.m_yc = t_poly.m_polygonPath[j].m_yc;cur.m_cw = t_poly.m_polygonPath[j].m_cw;double alpha1 = (double)((M_PI*(a_Angle(cur)))/180);//计算这个圆弧对应的圆心角,注意这里要转换成弧度制double r = sqrt((cur.m_xb - cur.m_xc) * (cur.m_xb - cur.m_xc) + (cur.m_yb - cur.m_yc) * (cur.m_yb - cur.m_yc));double discurve = alpha1 * r;//弧长int n = discurve/unit;  //要划分的份数double alpha = (double)(unit/ r);//每小段对应的弧度vector<seg_curve>segments (n+1);//储存离散化以后的每个线段   if (t_poly.m_polygonPath[j].m_cw=="N")//圆弧逆时针就是在复平面内乘以一个正的旋转因子{vector<double>x ;vector<double>y ;x.push_back(cur.m_xb);y.push_back(cur.m_yb);segments[0].m_type= "seg";segments[0].m_xs = x[0];//第一条线段就是起点到起点segments[0].m_ys = y[0];segments[0].m_xe =x[0];segments[0].m_ye =y[0];for (int m = 1; m < n + 1; m++)//将n条线段求出放到容器中,容器如果定义了长度,则每次就是从后面往进推,然后旧值被推到前面{x.push_back(cur.m_xc + (cur.m_xb - cur.m_xc) * cos(m * alpha) - (cur.m_yb - cur.m_yc) * sin(m * alpha));y.push_back(cur.m_yc + (cur.m_xb - cur.m_xc) * sin(m * alpha) + (cur.m_yb - cur.m_yc) * cos(m * alpha));segments[m].m_type = "seg";segments[m].m_xs = x[x.size()-2];segments[m].m_ys = y[y.size()-2];segments[m].m_xe = x.back();segments[m].m_ye = y.back();}}else if (t_poly.m_polygonPath[j].m_cw=="Y"){vector<double>x;vector<double>y;x.push_back(cur.m_xb);y.push_back(cur.m_yb);segments[0].m_type = "seg";segments[0].m_xs = cur.m_xb;segments[0].m_ys = cur.m_yb;segments[0].m_xe = cur.m_xb;segments[0].m_ye = cur.m_yb;for (int m = 1; m < n + 1; m++)//将n条线段求出来放到容器中{x.push_back(cur.m_xc + (cur.m_xb - cur.m_xc) * cos(m * alpha) +(cur.m_yb - cur.m_yc) * sin(m * alpha));y.push_back(cur.m_yc + (cur.m_yb - cur.m_yc) * cos(m * alpha)-(cur.m_xb - cur.m_xc) * sin(m * alpha));segments[m].m_type = "seg";segments[m].m_xs = x[x.size() - 2];segments[m].m_ys = y[y.size() - 2];segments[m].m_xe = x.back();segments[m].m_ye = y.back();}}/* for(int k=0;k<segments.size();k++){segcurves.push_back(segments[k]);}*/segandcur.push_back(segments);}else{vector<seg_curve>temp;temp.push_back(t_poly.m_polygonPath[j]);segandcur.push_back(temp);//如果不是圆弧,则是线段,直接放入栈中已备使用}}//循环出栈给边从而构造一个多边形for (int s= 0;s<segandcur.size();s++){poly.m_polygonPath.push_back(segandcur[s]);//并且每构造一个多边形都应该马上给到容器polygons中}poly.m_ob.m_ployType = t_poly.m_ob.m_ployType;return poly;
}

第二个函数是判断多边形这个顶点是凹点还是凸点,思想如下

1.一个顶点及其相邻两个顶点,构成两个线段

2两个线段上分别取一段极小的段,端点是A和B。我这里乘上0.0002,极小!!!

3取AB的中点C,再判断C点在多边形内部还是外部,从而判断凹凸点

bool Point_Is_Convex(double x, double y,polygon poly)
{bool sum = false;vector<seg_curve>segments;for (int i=0;i<poly.m_polygonPath.size();i++){segments.push_back(poly.m_polygonPath[i]);}bool flag = false;//标志这个点是此路径的起点,起点是trueint id = 0;//返回路径的编号for (int j = 0; j < segments.size();j++)//遍历寻找是哪个路径的{if ((x == segments[j].m_xs) || (x == segments[j].m_xe)){id = j;if (x == segments[j].m_xs){flag = true;}}else continue;}if ((id>0)&&(id<segments.size()-1)){if (flag){double x1 = segments[id - 1].m_xe - segments[id].m_xs;double y1 = segments[id - 1].m_ye - segments[id].m_ys;double x2 = segments[id].m_xe - segments[id].m_xs;double y2 = segments[id].m_ye - segments[id].m_ys;double k = 0.0002;double x3 = segments[id].m_xs + k * x1;double y3 = segments[id].m_ys + k * y1;double x4 = segments[id].m_xs + k * x2;double y4 = segments[id].m_ys + k * y2;double xx = (double)((x3 + x4) / 2);double yy = (double)((y3 + y4) / 2);if (PointInBound(xx, yy, segments)){sum = true;}}else{double x1 = segments[id].m_xs - segments[id].m_xe;double y1 = segments[id].m_ys - segments[id].m_ye;double x2 = segments[id + 1].m_xs - segments[id].m_xe;double y2 = segments[id + 1].m_ys - segments[id].m_ye;double k = 0.0002;double x3 = segments[id].m_xe + k * x1;double y3 = segments[id].m_ye + k * y1;double x4 = segments[id].m_xe + k * x2;double y4 = segments[id].m_ye + k * y2;double xx = (double)((x3 + x4) / 2);double yy = (double)((y3 + y4) / 2);if (PointInBound(xx, yy, segments)){sum = true;}}}else {if (id==0){if (flag){double x1 = segments[segments.size()-1].m_xe - segments[id].m_xs;double y1 = segments[segments.size()-1].m_ye - segments[id].m_ys;double x2 = segments[id].m_xe - segments[id].m_xs;double y2 = segments[id].m_ye - segments[id].m_ys;double k = 0.0002;double x3 = segments[id].m_xs + k * x1;double y3 = segments[id].m_ys + k * y1;double x4 = segments[id].m_xs + k * x2;double y4 = segments[id].m_ys + k * y2;double xx = (double)((x3 + x4) / 2);double yy = (double)((y3 + y4) / 2);if (PointInBound(xx, yy, segments)){sum = true;}}else{double x1 = segments[id].m_xs - segments[id].m_xe;double y1 = segments[id].m_ys - segments[id].m_ye;double x2 = segments[id+1].m_xs - segments[id].m_xe;double y2 = segments[id+1].m_ys - segments[id].m_ye;double k = 0.0002;double x3 = segments[id].m_xe + k * x1;double y3 = segments[id].m_ye + k * y1;double x4 = segments[id].m_xe + k * x2;double y4 = segments[id].m_ye + k * y2;double xx = (double)((x3 + x4) / 2);double yy = (double)((y3 + y4) / 2);if (PointInBound(xx, yy, segments)){sum = true;}}}else{if (flag){double x1 = segments[segments.size() - 2].m_xe - segments[id].m_xs;double y1 = segments[segments.size() - 2].m_ye - segments[id].m_ys;double x2 = segments[id].m_xe - segments[id].m_xs;double y2 = segments[id].m_ye - segments[id].m_ys;double k = 0.0002;double x3 = segments[id].m_xs + k * x1;double y3 = segments[id].m_ys + k * y1;double x4 = segments[id].m_xs + k * x2;double y4 = segments[id].m_ys + k * y2;double xx = (double)((x3 + x4) / 2);double yy = (double)((y3 + y4) / 2);if (PointInBound(xx, yy, segments)){sum = true;}}else{double x1 = segments[id].m_xs - segments[id].m_xe;double y1 = segments[id].m_ys - segments[id].m_ye;double x2 = segments[0].m_xs - segments[id].m_xe;double y2 = segments[0].m_ys - segments[id].m_ye;double k = 0.0002;double x3 = segments[id].m_xe + k * x1;double y3 = segments[id].m_ye + k * y1;double x4 = segments[id].m_xe + k * x2;double y4 = segments[id].m_ye + k * y2;double xx = (double)((x3 + x4) / 2);double yy = (double)((y3 + y4) / 2);if (PointInBound(xx, yy, segments)){sum = true;}}}}return sum;
}

多边形离散化函数和判断凹凸点的函数(原创亲测正确)相关推荐

  1. c语言isnumber函数的使用方法,使用ISNUMBER函数进行判断处理 使用ISNUMBER函数判断...

    使用ISNUMBER函数进行判断处理 使用ISNUMBER函数判断,这个问题是我们很多人都很困惑的一个问题,使用ISNUMBER函数判断是我们非常常用的一个东西,也是我们工作和学习中必不可少的一个数据 ...

  2. python 匿名函数添加判断_Python之内置函数、匿名函数

    一.内置函数(68个) 1. 作用域相关(2) locals(): 局部作用域中的变量 global(): 全局作用域中的变量 在全局中执行这两个变量,结果相同 def func(): pass fu ...

  3. PHP判断字符串是否含有特殊字符(亲测有效)

    正则判断是否含有指定的符号. 包含全角及半角符号,如果$str中含有除了指定符号以外的符号,则会返回false. 其他条件按需增减. 该正则含义:是否含有中文.字母.数字及指定符号. 注:如果有中文匹 ...

  4. JAVA如何判断两个字符串是否相等(亲测第二种方式)

    ==比较引用,equals 比较值 1.java中字符串的比较:== 我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题 example1: String a=&qu ...

  5. 人工智能数学基础:利用导数判断函数单调性、凹凸性、极值、最值和描绘函数图形

    一.单调性判断定理 定理: 设函数y=f(x)在[a,b]上连续,在(a,b)内可导. (1)如果在(a,b)内f(x)≥0,且等号仅在有限多个点处成立,那么函数y=f(x)在[a,b]上单调增加; ...

  6. mysql中日期判断的函数_MySql判断汉字、日期、数字的函数

    几个平常用的mysql函数 /***************************************************** 1.判断字符串是否为汉字 返回值:1-汉字 0-非汉字 *** ...

  7. C语言---写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

    题目: 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串. #include <string.h> #include <stdio.h> void left_re ...

  8. R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表、对转化为长表的数值数据列进行离散化、pivot_wider将数据转化为宽表

    R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表.对转化为长表的数值数据列进行离散化.pivot_wider将数据转化为宽表 ...

  9. pandas使用query函数基于判断条件获得dataframe中满足条件的数据行(row)的索引列表(index of rows matching conditions in dataframe)

    pandas使用query函数基于判断条件获得dataframe中满足条件的数据行(row)的索引列表(index of rows matching conditions in dataframe) ...

  10. 【C 语言】C 项目开发代码规范 ( 形参合法性判断 | 函数返回值局部变量 | 函数中不用全局变量 | 函数中使用局部变量接收形参 | 函数返回值 | 形参作返回值 | 形参返回值处理 )

    文章目录 一.C 项目开发代码规范 一.C 项目开发代码规范 上一篇博客 [C 语言]字符串模型 ( 键值对模型 ) 中 , 完成了字符串的 键值对 查找功能 , 代码不太规范 ; C 项目开发代码规 ...

最新文章

  1. qt web混合编程_QT做界面真是绝美,并且还可嵌入HTML与JS做界面(许多案例)
  2. JDBC有这一篇就够了(万字JDBC附代码详解)
  3. Fragment的布局中自定义Layout的onSizeChanged添加组件失败的问题
  4. [计算机组成原理] Booth算法 —— 补码一位乘法
  5. springboot 引入jdbc驱动_SpringBoot+MyBatis+Druid整合demo
  6. 入门 | 关于神经网络:你需要知道这些
  7. Currently, the Linux Mint team has 21 members
  8. FAQ系列 | mysqldump选项之skip-opt
  9. 当出现opencv的.dll无法找到的问题的时候用一下处理方法
  10. atomic原子类实现机制_原子操作CAS及其实现类
  11. 占位符是如何防止sql注入的?
  12. 郑州大学远程教育学院C语言程序设计题库(二)
  13. 酒水茶饮行业的门店管理系统进销存软件怎么挑选?
  14. javaMail实现邮件发送
  15. android png 动画背景透明,Android透明PNG文件添加底色
  16. mysql 空格显示问号_空格变成问号
  17. 国内jQuery CDN
  18. Typora Syntax
  19. ROS Stage学习
  20. 关于SSL证书链的一些认识

热门文章

  1. cmake gcc target specific option mismatch
  2. 产品读书《周鸿祎-我的互联网方法论》
  3. 教育技术学就业方向_教育技术学专业就业方向与就业前景
  4. as常用固定搭配_as固定短语搭配
  5. 阿里云服务器申请免费ssl证书
  6. Godaddy Backorder 失败后申请退款。
  7. 使用盒式布局实现登录界面
  8. ABAPDEMO批量更改BOM组件_SAP刘梦_新浪博客
  9. 国外问卷调查有哪几种类型?
  10. c语言无符号数最大值和最小值,c语言 int最大值是多少?