计算几何2010年4月8号用_第1页
计算几何2010年4月8号用_第2页
计算几何2010年4月8号用_第3页
计算几何2010年4月8号用_第4页
计算几何2010年4月8号用_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本讲概述:一、定义几个数据结构:点、线、面、体二、两个重要的向量运算:点积、叉积三、精度问题:esp四、实现判断点、线、面之间的关系typedef struct TPoint double x; double y; /double z;TPoint; typedef struct TVector double x; double y; /double z;TVector; typedef struct TLine /直线方程的系数 double a, b, c;TLine; ax + by + c = 0struct TFlourdouble a,b,c,d;ax + by + cz + d

2、= 0typedef struct TSegment TPoint t2; Tsegment;typedef struct TRadial TPoint p; TPoint INF;(无穷远出一点)TRadial;typedef struct TTriangle TPoint t3;TTriangle;typedef struct TCircle double r; TPoint centre;TCircle;typedef struct TPolygon TPoint pMaxNode; int n;TPolygon; typedef struct TPolygon TPoint pMaxN

3、ode; int n;TPolygon; 点积:叉积:11( ,)px y 22(,)qxysin,pqpqp q 方 向 根 据 右 手 定 则 确 定1212*pqxyyxdouble 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的顺时针方向 问什

4、么要设一个eps来控制精度呢?在计算机中,我们用浮点小数存储一个数,因而难免会产生一些误差,因而我们设一个非常小的数eps当一个数非常接近某一个比较特殊的数时,我们就认为这个数就等于这个比较特殊的数 例如0double distance(TPoint p1, TPoint p2) /计算平面上两个点之间的距离TPoint p; p.x = p1.x p2.x; p.y = p1.y p2.y; return sqrt(p.x * p.x + p.y * p.y); /多维矢量(空间)点的距离与此类似TPoint symmetricalPoint(TPoint p1, TPoint p2) /求

5、p1关于p2的对称点 TPoint p3; p3.x = 2 * p2.x - p1.x; p3.y = 2 * p2.y - p1.y; return p3;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;两点求直线方程121121yyyyxxxx判断p0点是否在点p1,p2决定的的直线上方法一1.根据p1, p2求出

6、直线的方程2.将p0代入直线方程(注意精度问题)方法二 叉积等于零abs(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) = min(s2.x, e2.x) & (max(s2.x, e2.x) = min(s1.x, e1.x) & (max(s1.y, e1.y) = min(s2.y, e2.y) & (max(s2.y, e2.y) = min(s1.y, e1.y) & (multi(s2, e1, s1) * multi(e1, e2, s1) = 0) & (multi(s1, e2, s2)

7、* multi(e2, e1, s2) = 0) ) return true; return false; 22AxBycdisABdouble PointToLine(TLine l,TPoint p)double d = sqrt(l.a*l.a+l.b*l.b);return fabs(l.a*p.x+l.b*p.y+l.c)/d;TPoint symmetricalPointofLine(TPoint p, TLine L) /p点关于直线L的对称点 TPoint p2; double d; d = L.a * L.a + L.b * L.b; p2.x = (L.b * L.b *

8、p.x - L.a * L.a * p.x - 2 * L.a * L.b * p.y - 2 * L.a * L.c) / d; p2.y = (L.a * L.a * p.y - L.b * L.b * p.y - 2 * L.a * L.b * p.x - 2 * L.b * L.c) / d; return p2;判断线段的两个点是否在直线的异侧或在其中一个在直线上bool SegmentInterLine(TLine l,TSegment s)double d1 = l.a*s.s.x+l.b*s.s.y+l.c;double d2 = l.a*s.e.x+l.b*s.e.y+l.c

9、;if(fabs(d1) eps | fabs(d2) eps | d1*d2 0)return true;else return false;根据叉积判断这两条直线是否平行bool LineParallerLine(TLine l1,TLine l2)double d = l1.a*l2.b-l2.a*l1.b;if(fabs(d) eps)return true;else return false;判断d点是否在a , b, c三点确定一个平面1.三点可以确定一个平面2.同时,平面上一点和平面的法线也可以确定这个平面平面的法线可以通过平面上两条不平行的矢量的叉积确定ab.x = b.x - a.x;ab.y = b.y - a.y;ab.z = b.z - a.z; ac.x = c.x - a.x;ac.y = c.y - a.y;ac.z = c.z - a.z;abc.a = ab.y * ac.z - ab.z * ac.y;abc.b = -(ab.x * ac.z - ab.z * ac.x);abc.c = ab.x * ac.y - ab.y * ac.x;abc.d = - ( abc.a*x + abc.b*y + abc.c*z);double dis(TFlour f,TPoin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论