![C语言常用二维解析几何函数集源代码_第1页](http://file4.renrendoc.com/view/06c00f77f1f9abfd9326334d7bd579f7/06c00f77f1f9abfd9326334d7bd579f71.gif)
![C语言常用二维解析几何函数集源代码_第2页](http://file4.renrendoc.com/view/06c00f77f1f9abfd9326334d7bd579f7/06c00f77f1f9abfd9326334d7bd579f72.gif)
![C语言常用二维解析几何函数集源代码_第3页](http://file4.renrendoc.com/view/06c00f77f1f9abfd9326334d7bd579f7/06c00f77f1f9abfd9326334d7bd579f73.gif)
![C语言常用二维解析几何函数集源代码_第4页](http://file4.renrendoc.com/view/06c00f77f1f9abfd9326334d7bd579f7/06c00f77f1f9abfd9326334d7bd579f74.gif)
![C语言常用二维解析几何函数集源代码_第5页](http://file4.renrendoc.com/view/06c00f77f1f9abfd9326334d7bd579f7/06c00f77f1f9abfd9326334d7bd579f75.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语言常用二维剖析几何函数集源代码2010-12-2922:29:28阅读50谈论0字号:大中小订阅这个代码是我今天放学后抽时间写的,采用了用于做动画也许游戏里较常用的数学函数(就是说不可以能很全面)包括简单的碰撞检测计算函数包括:向量加减法,向量点乘与叉乘,向量缩放,向量长度三角形面积,点到直线(和线段)的距离,判断直线平行,判断线段订交,求直线(和线段)的交点,点到直线的垂足,点关于直线的对称点,线段关于直线的反射线点绕给定点旋转判断点在三角形(和椭圆)内直线(和线段)与三角形碰撞,三角形与三角形碰撞两平行矩形碰撞,平行矩形与椭圆碰撞程序代码:#include<>//定义点结构typedefstructpoint{doublex;doubley;}point;//定义有向线段typedefstructsegment{points;pointe;}segment;//定义三角形typedefstructtriangle{pointp[3];}triangle;//定义精度误差constdoubleeps=1e-6;//两点距离doubledistance(constpoint*p1,constpoint*p2){doubledx=p1->x-p2->x,dy=p1->y-p2->y;returnsqrt(dx*dx+dy*dy);}//线段长doublelen(constsegment*seg){doubledx=seg->-seg->,dy=seg->-seg->;returnsqrt(dx*dx+dy*dy);}//线段长的平方doublelensqr(constsegment*seg){doubledx=seg->-seg->,dy=seg->-seg->;returndx*dx+dy*dy;}//向量加法pointadd(constpoint*p1,constpoint*p2){pointret;p1->x+p2->x;p1->y+p2->y;returnret;}//向量减法pointminus(constpoint*p1,constpoint*p2){pointret;p1->x-p2->x;p1->y-p2->y;returnret;}//向量缩放pointscale(constpoint*p,doubles){pointret;p->x*s;p->y*s;returnret;}//向量缩放(以o点为基准点)pointscale2(constpoint*p,constpoint*o,doubles){pointv;(p->x-o->x)*s;(p->y-o->y)*s;returnadd(&v,o);}//向量点乘doubledotmul(constpoint*p1,constpoint*p2){returnp1->x*p2->x+p1->y*p2->y;}//返回两点与原点组成的三角形面积的两倍(叉乘z值)doublemulti(constpoint*p1,constpoint*p2){returnp1->x*p2->y-p1->y*p2->x;}//返回三点组成的三角形面积的两倍(有次序,相当于叉乘)doublemulti3(pointp1,pointp2,pointp3){p2=minus(&p2,&p1);p3=minus(&p3,&p1);returnmulti(&p2,&p3);}//三角形面积doubletriangleArea(pointa,pointb,pointc){returnmulti3(a,b,c)/2;}//计算点到直线的距离,a,b定义那个直线,p为要计算的点doublepointToLine(pointa,pointb,pointp){a=minus(&a,&p);b=minus(&b,&p);returnfabs(multi(&a,&b))/distance(&a,&b);}//计算点到线段的距离,a,b定义那个线段,p为要计算的点doublepointToSeg(pointa,pointb,pointp){pointab,o={0};ab=minus(&b,&a);a=minus(&a,&p);b=minus(&b,&p);if(dotmul(&a,&ab)>-eps)returndistance(&o,&a);=;=;if(dotmul(&b,&ab)>-eps)returndistance(&o,&b);returnfabs(multi(&a,&b))/distance(&a,&b);}//判断两直线平行(重载1)intisParallelP(constpoint*as,constpoint*ae,constpoint*bs,constpoint*be){doubled1,d2;d1=multi3(*as,*bs,*ae);d2=multi3(*as,*ae,*be);returnfabs(d1+d2)<eps;}//判断两直线平行(重载2)intisParallelS(constsegment*a,constsegment*b){doubled1,d2;d1=multi3(a->s,b->s,a->e);d2=multi3(a->s,a->e,b->e);returnfabs(d1+d2)<eps;}//直线求交点(重载1)pointlinesIntersectP(constpoint*as,constpoint*ae,constpoint*bs,constpoint*be){pointret;doubled1,d2;d1=multi3(*as,*bs,*ae);d2=multi3(*as,*ae,*be);(bs->x*d2+be->x*d1)/(d1+d2);(bs->y*d2+be->y*d1)/(d1+d2);returnret;}//直线求交点(重载2)pointlinesIntersectS(constsegment*a,constsegment*b){pointret;doubled1,d2;d1=multi3(a->s,b->s,a->e);d2=multi3(a->s,a->e,b->e);(b->*d2+b->*d1)/(d1+d2);(b->*d2+b->*d1)/(d1+d2);returnret;}//点到直线的垂足pointpointToLineFoot(pointa,pointb,pointp){pointt;t=p;+=-;+=-;returnlinesIntersectP(&a,&b,&t,&p);}//点关于直线的对称点pointmirrorPoint(pointa,pointb,pointp){pointf;doubledis;dis=pointToSeg(a,b,p);if(dis<eps)returnp;f=pointToLineFoot(a,b,p);+=-;+=-;returnf;}//求对称线段也许反射线(返回点放回p,q)voidmirrorSeg(constpoint*a,constpoint*b,point*p,point*q){*p=mirrorPoint(*a,*b,*p);*q=mirrorPoint(*a,*b,*q);}//对p点以o点为中心逆时针旋转r弧度,计算结果返回p中(参数返回方式的重载)voidrotate(point*p,pointo,doubler){pointq;doublesr,cr;q=minus(p,&o);sr=sin(r);cr=cos(r);p->x=+(cr*-sr*;p->y=+(sr*+cr*;}//对p点以o点为中心逆时针旋转r弧度(直接返回点的重载)pointrotateR(pointp,pointo,doubler){pointq;doublesr,cr;q=minus(&p,&o);sr=sin(r);cr=cos(r);=+(cr*-sr*;=+(sr*+cr*;returnp;}//判断两线段订交(订交返回1,不订交返回0)intsegCrashSegP(constpoint*as,constpoint*ae,constpoint*bs,constpoint*be){doubles,t;s=multi3(*as,*bs,*be);t=multi3(*ae,*bs,*be);if(s*t>eps)return0;s=multi3(*bs,*as,*ae);t=multi3(*be,*as,*ae);if(s*t>eps)return0;return1;}//判断两线段订交(订交返回1,不订交返回0)intsegCrashSegS(constsegment*a,constsegment*b){doubles,t;s=multi3(a->s,b->s,b->e);t=multi3(a->e,b->s,b->e);if(s*t>eps)return0;s=multi3(b->s,a->s,a->e);t=multi3(b->e,a->s,a->e);if(s*t>eps)return0;return1;}//判断点在三角形内(返回1:内;返回0:边上;返回-1:外)intpointInTriangle(consttriangle*tri,constpoint*p){doubles,t;s=multi3(*p,tri->p[0],tri->p[1]);if(fabs(s)<eps)return0;t=multi3(*p,tri->p[1],tri->p[2]);if(fabs(t)<eps)return0;if((s<0)^(t<0))return-1;s=multi3(*p,tri->p[2],tri->p[0]);if(fabs(s)<eps)return0;if((s<0)^(t<0))return-1;return1;}//三角形与直线碰撞检测(碰撞返回1,不碰撞返回0)inttriangleCrashLine(consttriangle*tri,constsegment*seg){doubles,t;s=multi3(tri->p[0],seg->s,seg->e);t=multi3(tri->p[1],seg->s,seg->e);if((s<0)^(t<0))return1;s=multi3(tri->p[2],seg->s,seg->e);if((s<0)^(t<0))return1;return0;}//三角形与线段碰撞检测(碰撞返回1,不碰撞返回0)inttriangleCrashSeg(consttriangle*tri,constsegment*seg){if(pointInTriangle(tri,&seg->s)>0)return1;if(segCrashSegP(&tri->p[0],&tri->p[1],&seg->s,&seg->e))return1;if(segCrashSegP(&tri->p[0],&tri->p[2],&seg->s,&seg->e))return1;if(segCrashSegP(&tri->p[2],&tri->p[1],&seg->s,&seg->e))return1;return0;}//三角形与三角形碰撞检测(碰撞返回1,不碰撞返回0)inttriangleCrashTriangle(consttriangle*tri1,consttriangle*tri2){segmentseg;=tri2->p[0];=tri2->p[1];if(triangleCrashSeg(tri1,&seg))return1;=tri2->p[0];=tri2->p[2];if(triangleCrashSeg(tri1,&seg))return1;=tri2->p[2];=tri2->p[1];if(triangleCrashSeg(tri1,&seg))return1;return0;}//两平行于坐标轴的矩形碰撞检测(碰撞返回
1,不碰撞返回0)intrectCrashRect(constpoint*rect1lt,
constpoint*rect1rb,
const
point*
rect2lt,
constpoint*rect2rb){if(rect1lt->x>rect2rb->x||rect1lt->y>rect2rb->y)return0;if(rect2lt->x>rect1rb->x||rect2lt->y>rect1rb->y)return0;return1;}//判断点在椭圆内(返回1:内;返回0:边上;返回-1:外)intpointInEllipse(constpoint*elplt,constpoint*elprb,constpoint*pt){pointcenter,p;doublea,b,s;=(elplt->x+elprb->x)/2;a=-elplt->x;b=-elplt->y;a*=a;b*=b;p=minus(pt,¢er);s=*/a+*/b;if(fabs(s)<eps)return0;if(s>1)return-1;return1;
=(elplt->y+elprb->y)/2;}//判断平行矩形与椭圆碰撞(碰撞返回1,不碰撞返回0)intrectCrashEllipse(constpoint*rectlt,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 绿色能源技术研发合作合同
- 医疗器械代理注册合同书
- 正式借款合同
- 城市绿化项目实施与验收合同
- 节电小贴士(教学设计)-2023-2024学年四年级下册综合实践活动沪科黔科版
- 第21课《庄子二则-北冥有鱼》教学设计 2023-2024学年统编版语文八年级下册
- 社区团购仓储租赁协议
- 第5课计算机的资源管理 教学设计
- 律师事务所劳动仲裁合同8篇
- 无产权房屋买卖合同范本5篇
- 中建(轮扣架)模板工程施工方案
- 小区燃气安全宣传新闻稿
- WORD一级上机题答案
- 合唱社团第二学期活动记录
- 264省道淮安段(原淮安楚州施河至涟水五港公路)环评报告
- (完整版)书籍装帧设计
- 第九章古典文献的检索
- 初中物理实验全集-ppt
- 创新收益占有文献综述
- 急性肠系膜血管缺血性疾病
- GB/T 20169-2006离子型稀土矿混合稀土氧化物
评论
0/150
提交评论