EDPolygonInfo *pol;
EDPointInfo *pnt;
LWDVector *pos, *tangent, v1, v2;
int i, j, npoints, ccstart, ccend;
double vlen1, vlen2;
ccstart = ( pol->flags & EDPF_CCSTART ) != 0;
ccend = ( pol->flags & EDPF_CCEND ) != 0;
npoints = pol->numPnts + 2 - ( ccstart + ccend );
pos = calloc( npoints, sizeof( LWDVector ));
tangent = calloc( npoints, sizeof( LWDVector ));
for( i = 0; i < pol->numPnts; i++ ) {
pnt = edit->pointInfo( edit->state, pol->points[ i ] );
for( j = 0; j < 3; j++ )
pos[ i + !ccstart ][ j ] = pnt->position[ j ] ;
}
if ( !ccstart )
for ( j = 0; j < 3; j++ )
pos[ 0 ][ j ] = pos[ 3 ][ j ]
+ 3 * ( pos[ 1 ][ j ] - pos[ 2 ][ j ] );
if ( !ccend )
for ( j = 0; j < 3; j++ )
pos[ npoints - 1 ][ j ] = pos[ npoints - 4 ][ j ]
+ 3 * ( pos[ npoints - 2 ][ j ] - pos[ npoints - 3 ][ j ] );
for ( i = 1; i < npoints - 1; i++ ) {
vlen1 = vlen2 = 0;
for ( j = 0; j < 3; j++ ) {
v1[ j ] = pos[ i ][ j ] - pos[ i - 1 ][ j ];
v2[ j ] = pos[ i + 1 ][ j ] - pos[ i ][ j ];
vlen1 += v1[ j ] * v1[ j ];
vlen2 += v2[ j ] * v2[ j ];
}
vlen1 = sqrt( vlen1 );
vlen2 = sqrt( vlen2 );
if ( vlen1 == 0.0 || vlen2 == 0.0 )
for ( j = 0; j < 3; j++ )
tangent[ i ][ j ] = 0.0;
else
for ( j = 0; j < 3; j++ )
tangent[ i ][ j ] = ( v1[ j ] * vlen2 + v2[ j ] * vlen1 )
/ ( vlen1 + vlen2 );
}
0 < i < npoints - 1 において pos[ i ] と pos[ i + 1 ] 间の任意のポイント p(t) は、 次のコードで求めることができます。
hermite( t, &h1, &h2, &h3, &h4 );
for ( j = 0; j < 3; j++ )
pos[ j ] = h1 * pos[ i ][ j ]
+ h2 * pos[ i + 1 ][ j ]
+ h3 * tangent[ i ][ j ]
+ h4 * tangent[ i + 1 ][ j ];
void hermite( float t, float *h1, float *h2, float *h3, float *h4 )
{
float t2, t3;
t2 = t * t;
t3 = t * t2;
*h2 = 3.0f * t2 - t3 - t3;
*h1 = 1.0f - *h2;
*h4 = t3 - t2;
*h3 = *h4 - t2 + t;
}
參考答案:ccstart 和 ccend 的值只能是1或0,
[calloc( npoints, sizeof( LWDVector ))]
calloc:动态分配内存,npoints指向内存的首地址,内存的大小为sizeof( LWDVector )
只能看到这了,看不出具体是做什么用的.