点结构:

struct point
{double x,y;point(double a = 0,double b = 0): x(a),y(b){}
};

  

浮点误差处理:

int dblcmp(double x)
{if(fabs(x) < eps)return 0;return x > 0 ? 1:-1;
}
或者
int dblcmp(double x)
{if (x > eps) return 1;else if (x < -eps) return -1;else return 0;
}

判断线段是否相交并求交点(规范相交)

double det(double x1, double y1, double x2, double y2)
{    //求叉积return x1*y2 - x2*y1;
}double cross(Point a, Point b, Point c)
{    //向量ab,和向量acreturn det(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}double dotdet(double x1, double y1, double x2, double y2)
{    //点积return x1*x2 + y1*y2;
}double dot(Point a, Point b, Point c)
{return dotdet(b.x - a.x, b.y - a.y, c.x - a.x, c.y - a.y);
}int betweenCmp(Point a, Point b, Point c)
{    //判断a是不是在bc范围内return dbcmp(dot(a, b, c));
}bool segcross(Point a, Point b, Point c, Point d)
{double s1, s2;int d1, d2, d3, d4;d1 = dbcmp(s1 = cross(a, b, c));d2 = dbcmp(s2 = cross(a, b, d));d3 = dbcmp(cross(c, d, a));d4 = dbcmp(cross(c, d, b));if((d1^d2) == -2 && (d3^d4) == -2) {    //规范相交return true;}//非规范相交if((d1 == 0 && betweenCmp(c, a, b) <= 0) ||(d2 == 0 && betweenCmp(d, a, b) <= 0) ||(d3 == 0 && betweenCmp(a, c, d) <= 0) ||(d4 == 0 && betweenCmp(b, c, d) <= 0))return true;return false;
}

  

  

叉积求多边形面积

double area(point p[],int n){ //这里是相对于原点(0, 0),也可以在多边形上找一个点作为向量的起点double s = 0;int i;p[n].x = p[0].x;p[n].y = p[0].y;for(i = 0; i < n; ++i)s += det(p[i].x, p[i].y, p[i+1].x, p[i+1].y);return fabs(s / 2.0);
}

三角形面积:

1. 海伦公式

p = (a+b+c)/2;
S = sqrt(p*(p-a)*(p-b)*(p-c));

2:叉积求解:一直三点:

A(x1,y1),B(x2,y2),C(x3,y3);
S = fabs(-x2 * y1 + x3*y1+x1*y2-x3*y2-x1*y3+x2*y3) / 2.0;

判断多边形是否为凸多边形

输入p[1],p[2] ...p[n]。 令p[0] = p[n] p[n + 1] = p[1]; 
bool isconvexpg()
{int dir = 0;for (int i = 0; i <= n - 1; ++i){int temp = dblcmp(cross(p[i],p[i + 1],p[i + 2]));if (!dir) dir = temp;if (dir*temp < 0) return false;}return true;
}

  判断一点是否在多边形内,环顾法:

double getdis(point a,point b)
{double x = a.x - b.x;double y = a.y - b.y;return sqrt(x*x + y*y);
}
//利用点积求角度
double getangle(point a,point b,point c)
{double dj = dotdet(b.x - a.x,b.y - a.y,c.x - a.x,c.y - a.y);double dis = getdis(a,b)*getdis(a,c);double tmp = dj/dis;return acos(tmp);
}
//判断是否在多边形内
bool IsIn()
{int i;double angle = 0.0;for (i = 1; i <= n; ++i){if (dblcmp(cross(cir,p[i],p[i + 1])) >= 0)angle += getangle(cir,p[i],p[i + 1]);elseangle -= getangle(cir,p[i],p[i + 1]);}//printf("angle == %lf\n",angle);if (dblcmp(angle) == 0) return false;//在外边else if (dblcmp(angle - pi) == 0 || dblcmp(angle + pi) == 0)//在边上{if (dblcmp(r) == 0) return true;}else if (dblcmp(angle - 2.0*pi) == 0 || dblcmp(angle + 2.0*pi) == 0)//在里面{return true;}else //在多边行顶点{if (dblcmp(r) == 0) return true;}return false;
}

  求凸包的graham_scan算法模板

//这里起点与终点肯定在凸包上,不知道怎么证明
int graham(point *p,int len)
{top = 0;  int i;//先排序,lrj黑书上的排序方法sort(p,p + len,cmp);stack[top++] = p[0];stack[top++] = p[1];//求右链for (i = 2; i < len; ++i){while (top > 1 && dblcmp(cross(stack[top - 2],stack[top - 1],p[i])) <= 0) top--;stack[top++] = p[i];}//求左链int tmp = top;for (i =len - 2; i >= 0; --i){while (top > tmp && dblcmp(cross(stack[top - 2],stack[top - 1],p[i]))<= 0) top--;stack[top++] = p[i];}return top - 1;//起点两次进栈 - 1
}

  利用凸包求最远点距离——旋转卡壳法:

int rotaing(point *p,int len)
{p[len] = p[0];int ans = 0,q = 1;for (int i = 0; i < len; ++i){while (cross(p[i],p[i + 1],p[q + 1]) > cross(p[i],p[i + 1],p[q]))q = (q + 1)%len;ans = max(ans,max(dis2(p[i],p[q]),dis2(p[i + 1],p[q + 1])));//这里之所以计算i+1与q+1的距离是考虑到在凸多边形中存在平行边的问题}return ans;
}

  

计算几何(学习)模板相关推荐

  1. APP界面的数据可视化设计临摹学习模板

    设计app时,经常碰到很多页面需要把数据更直观的展示在用户面前,页面中复杂的数据展示让人头疼,怎样能让数据展示更直观更清晰?服务于UI|UX设计师的搜UI( sooui)带来了数据界面设计模板希望能给 ...

  2. 计算几何学习总结(使用教材算法设计与分析(第二版))

    ** 计算几何总结(使用教材算法设计与分析(第二版)李春葆 清华大学出版社) ** (代码大部分为书中原有代码,如有雷同,实属正常.) #include<bits/stdc++.h> us ...

  3. 【学习/模板】tarjan割点

    P3388 [模板]割点(割顶) tarjan爷爷造福世界 割点适用于无向图, 所以low数组定义发生变化,不再是最早能追溯到的栈中节点编号(因为是无向边,没有意义), 而是一直往下走能绕到的最早的割 ...

  4. html5只能django来写if吗,(4)Django学习——模板标签定义及语法:for循环,if判断,页面跳转,开启关闭自动转义,ur...

    1.常用标签 (1)模板标签重要概念: 1.定义:标签在渲染的过程中提供任意的逻辑 注意:(这个定义是刻意模糊的. 例如,一个标签可以输出内容,作为控制结构,例如"if"语句或&q ...

  5. (二)Flask 学习 —— 模板

    2019独角兽企业重金招聘Python工程师标准>>> 模板 回顾 如果你依照 Hello World 这一章的话,你应当有一个完全工作的简单的 web 应用程序,它有着如下的文件结 ...

  6. 计算几何学习之半平面交

    首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面. 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax ...

  7. 【笔记篇】最良心的计算几何学习笔记(二)

    依然放上本文的github地址- 作业QwQ 先来说一下上次留下的例题. poj这道题并没有实数比较模式.. 所以被精度势力干翻. 交上去WA掉竟然是因为-0.00和0.00不相等? 根据对拍结果别的 ...

  8. 【opencv学习】【模板匹配】

    今天学习模板匹配 模板图片 目标图像 import cv2 import matplotlib.pyplot as plt# 模板匹配的原理: # 一个模板图像在目标图像上机芯从左到右从上到下进行滑动 ...

  9. App引导页学习进阶临摹模板|UI界面设计步骤

    设计一个成功的App引导页可以说是我们APP界面设计师需要重点用心对待的事情,因为APP引导页的设计取决于用户对这个APP的第一印象,或是大概的了解. 像素精简版 - 免费引导4 UI套件​www.s ...

  10. (转)DEDECMS模板原理、模板标签学习 - .Little Hann

    本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理: 什么是编译式模板.解释式模板,它们的区别是什么? 模板标签有哪些种类,它们的区别是什么,都应用在哪些场景? 学习模板的机制 ...

最新文章

  1. oracle 查看连接数语句,Oracle数据库中查询连接数的实用sql语句
  2. 字符串分割split
  3. 【问题收录】Android Studio 2.2使用时出现问题总结
  4. 线程基础知识——Windows核心编程学习手札系列之六
  5. 玩转html5画图 - TimeLangoliers - 博客园
  6. ajax(jquery)前后台传数组(Springmvc后台)
  7. 数据库工作笔记009---linux 导入导出postgresql数据库
  8. 如何用1年时间获得3年成长?
  9. UVALive5461 UVA615 POJ1308 Is It A Tree?(解法二)【废除!!!】
  10. 爬虫入门【10】Pyspider框架简介及安装说明
  11. 方法代码ASP.NET MVC如何使用Ajax的辅助方法
  12. QTcpServer和QTcpSocket使用详解
  13. WinCC7.5 笔记3-用表格和趋势图显示温度变化和风扇运转(变量记录)
  14. TI DSP TMS320C66x学习笔记之TI Imglib库相关函数(四)
  15. 项目中pom.xml文件变灰且中间有横杠改怎么解决?
  16. 绿地智创金融谷项目成功举办第六届西安建筑业绿色施工示范工程观摩会
  17. 如何(以及为什么)在Word文档中使用隐藏文本
  18. phpstrom查看代码总行数_PHP统计代码行数的小代码
  19. 【KDD2022教程】图算法公平性:方法与趋势
  20. 【编程玄学】一个困扰我122天的技术问题,我好像知道答案了。

热门文章

  1. mysql前段编写_HTML、CSS、JavaScript、PHP、 MySQL 的学习顺序是什么?
  2. LNCS用户写作指南
  3. ACRush 楼天成回忆录 (与所有ACMer共勉!!)
  4. 友情链接查询工具 php源码,php 友情链接批量查询工具下载_PHP教程
  5. 计算2个复数之和与之积 (15分)
  6. 威客相当地址收藏_无需整理
  7. 使用MySQL,请用好 JSON 这张牌!
  8. ftp免费下载工具,五大容易上手的ftp免费下载工具
  9. 盘点全球最热门十家大数据公司中国占据三席
  10. 在Chrome中打印CSDN博客内容