OPENGL空间中直线和三角面片求交

上传人:碎****木 文档编号:220862959 上传时间:2021-12-09 格式:DOCX 页数:3 大小:12.05KB
返回 下载 相关 举报
OPENGL空间中直线和三角面片求交_第1页
第1页 / 共3页
OPENGL空间中直线和三角面片求交_第2页
第2页 / 共3页
OPENGL空间中直线和三角面片求交_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《OPENGL空间中直线和三角面片求交》由会员分享,可在线阅读,更多相关《OPENGL空间中直线和三角面片求交(3页珍藏版)》请在金锄头文库上搜索。

1、OPENGL 空间中直线和三角面片求交.txt 会计说:“你晚点来领工资吧,我这没零钱。”你看得出我擦了粉吗?虽然你身上喷了古龙水,但我还是能模糊闻到一股人渣味儿。既宅又腐,前 途未卜。既宅又腐,前途未卜。你被打胎后是怎么从垃圾桶里逃出来的?史上最奇特的部门: 有关部门。不行否认,马赛克是这个世纪阻碍人类裸体艺术进步最大的障碍!class CVectorpublic:unionfloat vec3;struct float x,y,z;class CCommonToolspublic:CCommonTools();virtual CCommonTools(); public:static bo

2、ol ValidPoint(CVector &LinePoint, CVector &LineV,CVector&TrianglePoint1, &TrianglePoint2, CVector &TrianglePoint3,CVector &result);static float Area(float a, float b, float c); static float Distance(CVector &p1, CVector &p2);/ CCommonTools:CCommonTools()CCommonTools:CCommonTools()/计算 p1 到 p2 的距离的平方f

3、loat CCommonTools:Distance(CVector &p1, CVector &p2)float dist;dist = (p2.x-p1.x)*(p2.x-p1.x)CVector+ (p2.y-p1.y)*(p2.y-p1.y)+ (p2.z-p1.z)*(p2.z-p1.z); return (float)sqrt(dist);/利用海伦公式求变成为 a,b,c 的三角形的面积float CCommonTools:Area(float a, float b, float c)float s = (a+b+c)/2;return (float)sqrt(s*(s-a)*(

4、s-b)*(s-c);bool CCommonTools:ValidPoint(CVector &LinePoint1, CVector &LinePoint2, CVector &TrianglePoint1, CVector&TrianglePoint2,CVector &TrianglePoint3,CVector &result)/三角形所在平面的法向量CVector TriangleV;/三角形的边方向向量CVector VP12, VP13;/直线与平面的交点CVector CrossPoint;/平面方程常数项float TriD;CVector LineV = LinePoin

5、t2 - LinePoint1;/*-计算平面的法向量及常数项*/point1-point2VP12.x = TrianglePoint2.x - TrianglePoint1.x; VP12.y = TrianglePoint2.y - TrianglePoint1.y; VP12.z = TrianglePoint2.z - TrianglePoint1.z;/point1-point3VP13.x = TrianglePoint3.x - TrianglePoint1.x; VP13.y = TrianglePoint3.y - TrianglePoint1.y; VP13.z = Tr

6、ianglePoint3.z - TrianglePoint1.z;/VP12xVP13TriangleV.x = VP12.y*VP13.z - VP12.z*VP13.y; TriangleV.y = -(VP12.x*VP13.z - VP12.z*VP13.x); TriangleV.z= VP12.x*VP13.y - VP12.y*VP13.x;/计算常数项TriD = -(TriangleV.x*TrianglePoint1.x+ TriangleV.y*TrianglePoint1.y+ TriangleV.z*TrianglePoint1.z);/*-求解直线与平面的交点坐标

7、*/* 思路:* 首先将直线方程转换为参数方程形式,然后代入平面方程,求得参数 t,* 将 t 代入直线的参数方程即可求出交点坐标*/float tempU, tempD; /临时变量tempU = TriangleV.x*LinePoint1.x + TriangleV.y*LinePoint1.y+ TriangleV.z*LinePoint1.z + TriD;tempD = TriangleV.x*LineV.x + TriangleV.y*LineV.y + TriangleV.z*LineV.z;/直线与平面平行或在平面上if(tempD = 0.0)/ printf(“The l

8、ine is parallel with the plane.n“); return false;/计算参数 tfloat t = -tempU/tempD;/计算交点坐标CrossPoint.x = LineV.x*t + LinePoint1.x; CrossPoint.y = LineV.y*t + LinePoint1.y; CrossPoint.z = LineV.z*t + LinePoint1.z;/*-推断交点是否在三角形内部*/计算三角形三条边的长度float d12 = Distance(TrianglePoint1, TrianglePoint2); float d13

9、= Distance(TrianglePoint1, TrianglePoint3); float d23 = Distance(TrianglePoint2, TrianglePoint3);/计算交点到三个顶点的长度float c1 = Distance(CrossPoint, TrianglePoint1); float c2 = Distance(CrossPoint, TrianglePoint2); float c3 = Distance(CrossPoint, TrianglePoint3);/求三角形及子三角形的面积float areaD = Area(d12, d13, d23); /三角形面积float area1 = Area(c1, c2, d12); /子三角形 1 float area2 = Area(c1, c3, d13); /子三角形 2 float area3 = Area(c2, c3, d23); /子三角形 3/依据面积推断点是否在三角形内部if(fabs(area1+area2+area3-areaD) 0.001)return false;result = CrossPoint; return true;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号