- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算几何 Computational Geometry 陈海丰 QQ:362339373 Email:chenhaifeng88888@ 2007-8-8 计算几何 计算几何研究几何模型和数据处理的学科,探讨几何形体的计算机表示。分析和综合,研究如何灵活、有效的建立几何形体的数学模型以及在计算机中更好地存储和管理这些模型数据 。 在ACM中,计算几何的知识点都比较简单,但是题目都不是那么好做,关键是靠平时积累经验。 基本概念 点 线(线段,直线) 面(三角形,圆,多变形(凸,凹)) 体 点 Point typedef struct TPoint { double x; double y; //double z; }TPoint; 线段 Segment typedef struct TSegment { TPoint t[2]; } TSegment; 直线 Line typedef struct TLine { //直线方程的系数 double a, b, c; }TLine; 三角形 Triangle typedef struct TTriangle { TPoint t[3]; }TTriangle; 圆 Circle typedef struct TCircle { double r; TPoint centre; }TCircle; 多边形 Polygon typedef struct TPolygon { TPoint p[MaxNode]; int n; }TPolygon; 点线面之间的关系 点与点 点与线 点与面 点与圆 点与多边形 线与线 线与面 面与面 点与点(距离) double distance(TPoint p1, TPoint p2) { //计算平面上两个点之间的距离 return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); } 多维矢量(空间)点的距离与此类似 点关于点的对称点 TPoint symmetricalPoint(TPoint p1, TPoint p2) { //求p1关于p2的对称点 TPoint p3; p3.x = 2 * p2.x - p1.x; p3.y = 2 * p2.y - p1.y; return p3; } 点与线 点是否在直线上 点是否在线段上 点到直线的距离 点关于直线的对称点 点是否在直线上(一) 判断p0点是否在点p1,p2决定的的直线上 1.根据p1, p2求出直线的方程 2.将p0代入直线方程(注意精度问题) 直线方程 TLine lineFromSegment(TPoint p1, TPoint p2) { //线段所在直线,返回直线方程的三个系数 TLine tmp; tmp.a = p2.y - p1.y; tmp.b = p1.x - p2.x; tmp.c = p2.x * p1.y - p1.x * p2.y; return tmp; } 两点求直线方程 点是否在直线上(二) 根据矢量的叉积来判断 先看一下矢量(Vector)的叉积 矢量叉积 三维矢量的叉积 点是否在直线上(二) double multi(TPoint p1, TPoint p2, TPoint p0) { //求矢量[p0, p1], [p0, p2]的叉积 //p0是顶点 return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y); //若结果等于0,则这三点共线 //若结果大于0,则p0p2在p0p1的逆时针方向 //若结果小于0,则p0p2在p0p1的顺时针方向 } 点是否在线段上(一) 判断p0点是否在以点p1,p2点为端点的线段上 点是否在线段上(二) 判断p点是否在线段p1p2上 1.p是否在直线p1p2上 2.p是否在以p1p2为对角线的矩形中 点是否在线段上(二) bool isPointOnSegment(TPoint p, TPoint p1, TPoint p2) { if(multi(p1, p2, p) != 0) return false ; if((p.x p1.x p.x p2.x) || (p.
原创力文档


文档评论(0)