代码如下,一共4个for循环逐个套用,导致循环次数过大,程序目的为OPENGL中直线与三角面片求交点
{
CLine *pLine;
CFacet *facet,*facet1;
CVertex *pvertex0,*pvertex1;
double x0,y0,z0,x1,y1,z1,x2,y2,z2,X0,Y0,Z0,t0;
int i;
double x000,y000,z000,x111,y111,z111,x222,y222,z222,x333,y333,z333;
double x01,y01,z01,a0,b0,c0,a1,b1,c1,S0,S1,S2,S3,p0,p1,p2,p3;
double x11,y11,z11,x22,y22,z22;
double x001,y001,z001;
POSITION pos,pos0,pos1;
x0=0;
y0=0;
z0=5;
m_jiaodian1.RemoveAll();
m_jiaodian2.RemoveAll();
x1=x0;
y1=y0;
z1=-10; //点
x2=100*cos(1); //另一个点
y2=100*sin(1);
z2=z1;
X0=x1+cos(1)*t0;
Y0=y1+sin(1)*t0; //参数方程
Z0=0;
for(pos = m_zhongjiandaociqumian.GetHeadPosition();pos!=NULL; ) //求一条投影线与所有三角面片所在平面的交点
{
facet=(CFacet*)m_zhongjiandaociqumian.GetNext(pos);
x11=facet->m_dNormal.x;
y11=facet->m_dNormal.y;
z11=facet->m_dNormal.z;
x22=facet->m_dVertex1.x;
y22=facet->m_dVertex1.y;
z22=facet->m_dVertex1.z;
// x11*(X1-x22)+y22*(Y1-y22)+z22(Z1-z22)=0; //面方程,需不需要?好像不需要
t0=((x22-x1)*x11+(y22-y2)*y11+(z22-z2)*z11/(x11*cos(1)+y11*sin(1)+z11*0));
x01=x1+cos(1)*t0;
y01=y1+sin(1)*t0;
z01=z1;
pvertex0=new CVertex;
pvertex0->x=x01;
pvertex0->y=y01;
pvertex0->z=z01;
m_jiaodian1.AddTail(pvertex0);
for(pos1 = m_zhongjiandaociqumian.GetHeadPosition();pos1!=NULL; )
{
pvertex0=(CVertex*)m_jiaodian1.GetNext(pos1);
x001=pvertex0->x;
y001=pvertex0->y;
z001=pvertex0->z;
for(pos0 = m_zhongjiandaociqumian.GetHeadPosition();pos0!=NULL;) //确定与三角面片的交点
{
facet1=(CFacet*)m_zhongjiandaociqumian.GetNext(pos0);
//三角面片三个顶点
x000=facet1->m_dNormal.x;
y000=facet1->m_dNormal.y;
z000=facet1->m_dNormal.z;
x111=facet1->m_dVertex1.x;
y111=facet1->m_dVertex1.y;
z111=facet1->m_dVertex1.z;
x222=facet1->m_dVertex2.x;
y222=facet1->m_dVertex2.y;
z222=facet1->m_dVertex2.z;
x333=facet1->m_dVertex3.x;
y333=facet1->m_dVertex3.y;
z333=facet1->m_dVertex3.z;
a0=sqrt(pow(x111-x222,2)+pow(y111-y222,2)+pow(z111-z222,2)); //计算三角面片三条边的长度
b0=sqrt(pow(x111-x333,2)+pow(y111-y333,2)+pow(z111-z333,2));
c0=sqrt(pow(x333-x222,2)+pow(y333-y222,2)+pow(z333-z222,2));
a1=sqrt(pow(x001-x111,2)+pow(y001-y111,2)+pow(z001-z111,2)); //计算交点到三角面片三个顶点的距离
b1=sqrt(pow(x001-x222,2)+pow(y001-y222,2)+pow(z001-z222,2));
c1=sqrt(pow(x001-x333,2)+pow(y001-y333,2)+pow(z001-z333,2));
p0=(a0+b0+c0)/2; //海伦公式计算三角面片面积和三个小三角形的面积
S0=pow(p0*(p0-a0)*(p0-b0)*(p0-c0),0.5);
p1=(a0+a1+b1)/2;
S1=pow(p1*(p1-a0)*(p1-a1)*(p1-b1),0.5);
p2=(b0+a1+c1)/2;
S2=pow(p2*(p2-b0)*(p2-a1)*(p2-c1),0.5);
p3=(c0+b1+c1)/2;
S3=pow(p3*(p3-c0)*(p3-b1)*(p3-c1),0.5);
if(fabs(S1+S2+S3-S0)<0.1)
{
pvertex1=new CVertex; //如果在三角面片上,存入新链表
pvertex1->x=x001;
pvertex1->y=y001;
pvertex1->z=z001;
m_jiaodian2.AddTail(pvertex1);
}
}
}
}
}
求交点的话,你能用一个简单的数据集么?具体错误是什么?
你需要考虑 m_jiaodian1 和 m_jiaodian2 哪些地方用完后可以删掉。内存不足肯定是两处new 分配的对象过多。