版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语言常用二维剖析几何函数集源代码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学年四年级上学期11月期中英语试题
- 《心肌梗死诊治流程》课件
- 2024届上海市风华中学物理高一第一学期期中综合测试试题含解析
- OBE理念下的课程目标设计
- 求职面试技巧培训课件
- 部编人教版六年级上册语文全册课文教学课堂实录
评论
0/150
提交评论