c语言triangle函数,Triangle/triangle intersection test routine

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

float U0[3],float U1[3],float U2[3]) {

float A[3];

short i0,i1;

/* first project onto an axis-aligned plane, that maximizes the area */

/* of the triangles, compute indices: i0,i1. */

#pragma warning( disable : 4244 )

A[0]=fabs(N[0]);

A[1]=fabs(N[1]);

A[2]=fabs(N[2]);

#pragma warning( default : 4244 )

if(A[0]>A[1]) {

if(A[0]>A[2]) {

i0=1;      /* A[0] is greatest */

i1=2;

} else {

i0=0;      /* A[2] is greatest */

i1=1;

}

} else   /* A[0]<=A[1] */

{

if(A[2]>A[1]) {

i0=0;      /* A[2] is greatest */

i1=1;

} else {

i0=0;      /* A[1] is greatest */

i1=2;

}

}

/* test all edges of triangle 1 against the edges of triangle 2 */

EDGE_AGAINST_TRI_EDGES(V0,V1,U0,U1,U2);

EDGE_AGAINST_TRI_EDGES(V1,V2,U0,U1,U2);

EDGE_AGAINST_TRI_EDGES(V2,V0,U0,U1,U2);

/* finally, test if tri1 is totally contained in tri2 or vice versa */

POINT_IN_TRI(V0,U0,U1,U2);

POINT_IN_TRI(U0,V0,V1,V2);

return 0;

}

int tri_tri_intersect(float V0[3],float V1[3],float V2[3],

float U0[3],float U1[3],float U2[3]) {

float E1[3],E2[3];

float N1[3],N2[3],d1,d2;

float du0,du1,du2,dv0,dv1,dv2;

float D[3];

float isect1[2], isect2[2];

float du0du1,du0du2,dv0dv1,dv0dv2;

short index;

float vp0,vp1,vp2;

float up0,up1,up2;

float b,c,max;

/* compute plane equation of triangle(V0,V1,V2) */

SUB(E1,V1,V0);

SUB(E2,V2,V0);

CROSS(N1,E1,E2);

d1=-DOT(N1,V0);

/* plane equation 1: N1.X+d1=0 */

/* put U0,U1,U2 into plane equation 1 to compute signed distances to the plane*/

du0=DOT(N1,U0)+d1;

du1=DOT(N1,U1)+d1;

du2=DOT(N1,U2)+d1;

/* coplanarity robustness check */

#if USE_EPSILON_TEST==TRUE

if(fabs(du0)

du0=0.0;

if(fabs(du1)

du1=0.0;

if(fabs(du2)

du2=0.0;

#endif

du0du1=du0*du1;

du0du2=du0*du2;

if(du0du1>0.0f && du0du2>0.0f) /* same sign on all of them + not equal 0 ? */

return 0;                    /* no intersection occurs */

/* compute plane of triangle (U0,U1,U2) */

SUB(E1,U1,U0);

SUB(E2,U2,U0);

CROSS(N2,E1,E2);

d2=-DOT(N2,U0);

/* plane equation 2: N2.X+d2=0 */

/* put V0,V1,V2 into plane equation 2 */

dv0=DOT(N2,V0)+d2;

dv1=DOT(N2,V1)+d2;

dv2=DOT(N2,V2)+d2;

#if USE_EPSILON_TEST==TRUE

if(fabs(dv0)

dv0=0.0;

if(fabs(dv1)

dv1=0.0;

if(fabs(dv2)

dv2=0.0;

#endif

dv0dv1=dv0*dv1;

dv0dv2=dv0*dv2;

if(dv0dv1>0.0f && dv0dv2>0.0f) /* same sign on all of them + not equal 0 ? */

return 0;                    /* no intersection occurs */

/* compute direction of intersection line */

CROSS(D,N1,N2);

/* compute and index to the largest component of D */

#pragma warning( disable : 4244 )

max=fabs(D[0]);

index=0;

b=fabs(D[1]);

c=fabs(D[2]);

#pragma warning( default : 4244 )

if(b>max)

max=b,index=1;

if(c>max)

max=c,index=2;

/* this is the simplified projection onto L*/

vp0=V0[index];

vp1=V1[index];

vp2=V2[index];

up0=U0[index];

up1=U1[index];

up2=U2[index];

/* compute interval for triangle 1 */

COMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0dv1,dv0dv2,isect1[0],isect1[1]);

/* compute interval for triangle 2 */

COMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0du1,du0du2,isect2[0],isect2[1]);

SORT(isect1[0],isect1[1]);

SORT(isect2[0],isect2[1]);

if(isect1[1]

return 0;

return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值