⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matrix.cpp

📁 Hi guys, I have a B-spline curve algorithm by using Genetic algorithm. Any interested?
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    bmatcb (t1,ns,aitemp2,vtx,x1); 
	for(k=0;k<3;k++){
		d1[k]=x1[k]/del[ns-1];
	} // k 

    t2[0]=0.0; 
    t2[1]=0.0;  
    t2[2]=2.0;
    t2[3]=6.0*tl; 

    bmatcb (t2,ns,aitemp2,vtx,x2); 
	for(k=0;k<3;k++){
		d2[k]=x2[k]/del[ns-1]/del[ns-1];
	} // k 

    a[0]=d1[1]*d2[2]-d1[2]*d2[1];
    a[1]=d1[2]*d2[0]-d1[0]*d2[2];
    a[2]=d1[0]*d2[1]-d1[1]*d2[0];

    a1=sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
    a2=sqrt(d1[0]*d1[0]+d1[1]*d1[1]+d1[2]*d1[2]);
    a3=(a2*a2*a2);
    if (fabs(a3)<tiny) goto i_999; 
    *cm=a1/a3;

    return istat;
i_999:
	istat=1;
	return istat;
}
//----------------------------------------------------------------------*
int crossp(float aaa[3],float bbb[3],float ccc[3])
{
	float ddd;
	int istat;
	istat=0;

	ccc[0]=aaa[1]*bbb[2]-aaa[2]*bbb[1];
	ccc[1]=aaa[2]*bbb[0]-aaa[0]*bbb[2];
	ccc[2]=aaa[0]*bbb[1]-aaa[1]*bbb[0];

	ddd=sqrt(ccc[0]*ccc[0]+ccc[1]*ccc[1]+ccc[2]*ccc[2]);
	if(ddd==0.0) goto i_999;

	ccc[0]=ccc[0]/ddd;
	ccc[1]=ccc[1]/ddd;
	ccc[2]=ccc[2]/ddd;
	return istat;
i_999:
	istat=1;
	return istat;
}
//----------------------------------------------------------------------*
void gpa2lpa(int kord,int npts,float xv[],float tpa,int *nseg,float *tl) 
{
	int i,k;
	float dd;

    *nseg=0;
    k=kord-1; 
	for(i=0;i<npts-1;i++){
        dd=(xv[k+i+1]-tpa)*(tpa-xv[k+i]); 
		if(dd>=0.0){
			*nseg=i+1; 
			*tl=(tpa-xv[k+i])/(xv[k+i+1]-xv[k+i]); 
          return ;
        } //endif
	} //i
    return ;
}
//----------------------------------------------------------------------*

void bmatcb(float t[],int ns,float aitemp3[][4][4],float vtx[][3],float x[]) 
{
	int j,k;
	float s[4];

	for(k=0;k<4;k++){
        s[k]=0.0;
		for(j=0;j<4;j++){
			s[k]=s[k]+t[j]*aitemp3[ns-1][k][j];
		} //j
	} //k
	for(k=0;k<3;k++){
		x[k]=0.0;
		for(j=0;j<4;j++){
			x[k]=x[k]+s[j]*vtx[ns+j-1][k];
		} //j
	} //k
}
//----------------------------------------------------------------------*
void mkt0(float d[],int npts,float s0[3],float s1[3])
{
	float x[4][4],r[3],dl1[2],dm1[2],dn1[2];
	float q1[3],q2[3];
	float d1,d2,s,ss2,r20;
	int ierr,is;
	int i,j,k,ii,kk;

/*	if(npts<3) {
		q1[0]=d[0];
		q1[1]=d[1];
		q1[2]=d[2];

		q2[0]=d[3];
		q2[1]=d[4];
		q2[2]=d[5];
		linvec(q1,q2,s0,s1);
		return;
	}*/

	for(is=1;is<=2;is++){
		for(i=1;i<=3;i++){
			if(is==1){
				ii=i;
			}else{
				ii=npts-3+i;
			}

		kk=(ii-1)*3;

		for(j=1;j<=3;j++) x[j-1][i-1]=d[kk+j-1];

		} //i
// 210

	d1=   pow( (x[0][1]-x[0][0]) , 2.) 
		+ pow( (x[1][1]-x[1][0]) , 2.) 
		+ pow( (x[2][1]-x[2][0]) , 2.) ;

	d2=   pow( (x[0][2]-x[0][1]) , 2.) 
		+ pow( (x[1][2]-x[1][1]) , 2.) 
		+ pow( (x[2][2]-x[2][1]) , 2.) ; 
	d1=sqrt(d1);
	d2=sqrt(d2);

	s=d1/(d1+d2);
	ss2=s-s*s;

	if(is==1) {
		for(j=1;j<=3;j++){
			r20=x[j-1][2]-x[j-1][0];
			r[j-1]=r20-(r20*s - x[j-1][1] + x[j-1][0])/ss2;
		} //j
//220

	} else {
	
		for(j=1;j<=3;j++){
			r20=x[j-1][2]-x[j-1][0];
			r[j-1]=r20+(r20*s - x[j-1][1] + x[j-1][0])/ss2;
		} //j
//230
 
	} // if else

		d1=sqrt( r[0]*r[0]+r[1]*r[1]+r[2]*r[2]);
		dl1[is-1]=r[0]/d1;
		dm1[is-1]=r[1]/d1;
		dn1[is-1]=r[2]/d1;

	} //is

// 200

	s0[0]=dl1[0];
	s0[1]=dm1[0];
	s0[2]=dn1[0];

	s1[0]=dl1[1];
	s1[1]=dm1[1];
	s1[2]=dn1[1];
}
//----------------------------------------------------------------------*
static float a[mmax][mmax];
//----------------------------------------------------------------------*
void curfit(int kord,int npts,float dp[][3],float t0[3],float t1[3],float xv[],float vone[][3])
{
	float indx[mmax];
	float del[mmax],d1[mmax][3];
	int n,n2,n3;

	int i,j,k;

	n=npts-1;
	n2=n+2;
	n3=n+3;

	mkdel(npts,dp,del);
	mksdel(npts,del,xv);
	mkamat(npts,del,a);

	for(k=0;k<3;k++){
	   for(j=2;j<=npts-1;j++){
		 d1[j][k]=dp[j-1][k];
	   } //j
// 61
	  d1[0][k]	= dp[0][k];
	  d1[1][k]    = t0[k];
	  d1[n2-1][k] = t1[k];
	  d1[n3-1][k] = dp[npts-1][k];
	} //k

// 61
	tridi(n3,a,3,d1);

	for(i=0;i<n3;i++){
		for(j=0;j<3;j++){
			vone[i][j]=d1[i][j];
		}
	}

// 60
}
//----------------------------------------------------------------------*
void mkdel(int n,float dp[][3],float del[])
{
	int i;
	for(i=1;i<=n-1;i++){
		del[i-1]=sqrt(  pow( dp[i][0]-dp[i-1][0] ,2.)
					  +	pow( dp[i][1]-dp[i-1][1] ,2.)
					  + pow( dp[i][2]-dp[i-1][2] ,2.) );
	} // i
}
//----------------------------------------------------------------------*
void mksdel(int n,float del[],float xv[])
{
	int i;


// 10
	xv[0]=0.;
	xv[1]=0.;
	xv[2]=0.;
	xv[3]=0.;

	for(i=1;i<=n-1;i++)
		xv[i+3]=xv[i+2]+del[i-1];
// 20
	
	xv[n+3]=xv[n+2];
	xv[n+4]=xv[n+2];
	xv[n+5]=xv[n+2];

	return ;
}
//----------------------------------------------------------------------*
void mkamat(int npts,float del[],float a[][mmax])
{

	
	float del1,del2,del3,del4,del5;
	float f,g;
	int n1,n2,n3,m,ik;


	int i,j,k;
	
    n1=npts-1;
	n2=npts+1;
	n3=npts+2;

// reset zero

	for(i=0;i<n3;i++){
		for(j=0;j<n3;j++){
			a[j][i]=0.;
		} //j
	} //i
// 25

// Make the A Matrix

	a[0][0]=1.0;
	a[0][1]=-3.0/del[0];
	a[1][1]=3.0/del[0];

	for(m=4;m<=n2;m++){

		del1=delval(npts,del,m  ,1);
		del2=delval(npts,del,m-1,2);
		del3=delval(npts,del,m-2,3);
		del4=delval(npts,del,m-1,1);
		del5=delval(npts,del,m-1,3);

		f=del1*del1/del2/del3;
		g=del4*del4/del2/del5;
		
		ik=m-1;

		a[ik-2][ik-1]=f;
		a[ik-1][ik-1]=( 1.0-f-g );
		a[ik  ][ik-1]=g;

	} //m

	a[n2-1][n2-1]=-3.0/del[n1-1];
	a[n3-1][n2-1]= 3.0/del[n1-1];
	a[n3-1][n3-1]= 1.0;
	return;
} 
// --------------------------------------------------------------------------*
// Function Start
// --------------------------------------------------------------------------*
// -----------------------------------------------------------------*
//  tridiagonal       change Fortran -> C++
//  void tridi (n,mp,am,m,d);    old function
//  void tridi (n,am,m,d);       new function
// -----------------------------------------------------------------*
// void tridi(int n,float am[][mmax],int m,float d[][3]);

// -----------------------------------------------------------------*
//                   Input Data
//		 
//           Ax=d 
//
//  int n             :  Vertex Number  (Point+TangentVecter)
//  float am[][mmax]  :	 Matrix   n * n	       -> A
// 	int m             :  if m=2 x,y     if m=3 x,y,z
//  float d[mmax][3]  :  Point+TanglentVecter  -> d
// 
//                   Output Data
//  float d[mmax][3]  :  Vertex     	       -> x 
// -----------------------------------------------------------------*

int tridi(int n,float am[][300],int m,float d[][3])
{
	float a[300],b[300],c[300];
	float gam[300],y[300][300];

	float tin;
	float zero;
	float z1,z2,zz;
	int i,j,k;
	
	tin=1.0e-20f;
	zero=0.;

	for(i=1;i<=n;i++){
	 if(i!=1) a[i-1] = am[i-2][i-1];
	 b[i-1]= am[i-1][i-1];
	 if(i!=n) c[i-1]=am[i][i-1];
	}
// 100 i

	a[0]=0.;
	c[n-1]=0.;

	for(i=1;i<=m;i++)
	 y[i-1][0] = d[0][i-1] / b[0];

// 110 i
	gam[0]=c[0]/b[0];


	for(i=2;i<=n-1;i++){
	  		  
//	  z1 = fabs( b[i-1] );
//	  z2 = fabs( c[i-2] ) + fabs ( a[i] );

//	  if(z1 < z2)  return -1; // return value input!
  
	  zz=b[i-1]-a[i-1]*gam[i-2];

	  if(zz==zero) zz=tin;
	  gam[i-1]=c[i-1]/zz;

	  for(j=1;j<=m;j++){
	    zz=b[i-1]-a[i-1] * gam[i-2];
	    if(zz==zero) zz=tin;

	    y[j-1][i-1] =(  d[i-1][j-1]-  a[i-1] * y[j-1][i-2]  )/zz;
	  }// j

	} // i
	
// 120 j,i
	  for(i=n;i<=n;i++){
		zz= b[i-1]-a[i-1] * gam[i-2];
	    if(zz==zero) zz=tin;
		gam[i-1]=c[i-1]/zz;

	    for(j=1;j<=m;j++){
	      zz=b[i-1]-a[i-1]*gam[i-2];
	      if(zz==zero) zz=tin;
		  y[j-1][i-1]= ( d[i-1][j-1] - a[i-1] * y[j-1][i-2] ) /zz;
	    } //j
	  }   //i
// 125  j,i;

	for(j=1;j<=m;j++){
	  d[n-1][j-1]= y[j-1][n-1];

	  for(i=1;i<=n-1;i++){
		k=n-i;
		d[k-1][j-1] = y[j-1][k-1] - gam[k-1] * d[k][j-1];
	  } //i
	} // j
// 140 , 130
		return 0;
}
//----------------------------------------------------------------------*
float delval(int npts,float del[],int i,int k)
{
	float delv,dd;
	int j;
	delv=0.;
	for(j=i;j<=i+k-1;j++){
		dd=0.;
		if(j>2 && j< (npts+2)) dd=del[j-3];

		delv=delv+dd;
	} //j
	return delv;
}
//----------------------------------------------------------------------*
int refang2(float s1[3],float s2[3],float *angle)
{
	double a[3],b[3],ang,sum1,sum2,sum3,dtol;
	int istat;

	istat=0;
	dtol=1.0e-07;

	a[0]=(double)s1[0];
	a[1]=(double)s1[1];
	a[2]=(double)s1[2];

	b[0]=(double)s2[0];
	b[1]=(double)s2[1];
	b[2]=(double)s2[2];

//----------------------------------------------------------------------*
// vector a             
//----------------------------------------------------------------------*
  	
	sum1=sqrt( a[0]*a[0]+a[1]*a[1]+a[2]*a[2] );

//----------------------------------------------------------------------*
// vector b             
//----------------------------------------------------------------------*
	sum2=sqrt( b[0]*b[0]+b[1]*b[1]+b[2]*b[2] );

//----------------------------------------------------------------------*
// a.b                  
//----------------------------------------------------------------------*

	sum3= a[0]*b[0]+a[1]*b[1]+a[2]*b[2];

//----------------------------------------------------------------------*
// relative angle       
//----------------------------------------------------------------------*
  
    if( sum1< dtol) {
		istat=1;
		return istat;
	}
	if( sum2< dtol) {
		istat=1;
		return istat;
	}

	sum3=sum3/sum2/sum1;
	
	sum3=min(sum3,1.0f);
	sum3=max(sum3,-1.0f);
	ang=acos( sum3);
	*angle=(float)ang;
	return istat;
}
//----------------------------------------------------------------------*
int unitvc(float a[3],float *dist)
{

	int istat;
	istat = 0;
	*dist = sqrt( a[0]*a[0] + a[1]*a[1] + a[2]*a[2] );
	if( *dist < 1.0e-08f )goto L_999;
	a[0] = a[0]/ *dist;
	a[1] = a[1]/ *dist;
	a[2] = a[2]/ *dist;

	return istat;
L_999:
	;
	istat = 1;
	return istat;
}
//----------------------------------------------------------------------*

int dptPlaneq(int np,float dp[][3],float plq[4])
{
	int ierr, i,k,istat;
	float tol,dd;
	float a[3],b[3],c[3];

	/* istat=0 : no plane curve  */

	istat = 0;
	if (np < 3)	return istat;
//	getEpsCvNode(&tol);

//	tol=tol*10.0f;

	ierr=avgNvec(np,dp,plq);
	plq[3] = 0.0f;
	for (i = 1; i <= np; i++) {
		plq[3] =plq[3]-( plq[0]*dp[i-1][0] + plq[1]*dp[i-1][1] + plq[2]*dp[i-1][2]);
	}
	plq[3] /=(float) np;

	dd=0.0f;
	for(i=0;i<np;i++){
		dd+=fabs(
			plq[0]*dp[i][0]+
			plq[1]*dp[i][1]+
			plq[2]*dp[i][2]+
			plq[3]);
	}
	dd=dd/(float)np;
//	if(dd>tol) return istat;

	istat = 1;

	return istat;
}
//----------------------------------------------------------------------*
int avgNvec(int n,float v[][3],float pn[3])
{
	int istat;
	int i, j;
	float tiny, a1, b1, c1, d1;
	/* average normal vector in loop 
	 * loop is not closed  */

	istat = 0;
	tiny = 1.0e-12f;

	a1 = 0.0f;
	b1 = 0.0f;
	c1 = 0.0f;
	for( i = 1; i <= n; i++ ){
		if( i == n ){j = 1;
			}
		else{
			j = i + 1;
			}
		a1 = a1 + (v[i - 1][1] - v[j - 1][1])*(v[i - 1][2] + v[j - 1][2]);
		b1 = b1 + (v[i - 1][2] - v[j - 1][2])*(v[i - 1][0] + v[j - 1][0]);
		c1 = c1 + (v[i - 1][0] - v[j - 1][0])*(v[i - 1][1] + v[j - 1][1]);
		}
	a1 = a1/ n;
	b1 = b1/ n;
	c1 = c1/ n;
	d1 = sqrt( a1*a1 + b1*b1 + c1*c1 );
	if( d1 < tiny )
		goto L_999;
	pn[0] = a1/d1;
	pn[1] = b1/d1;
	pn[2] = c1/d1;

	return istat;
L_999:
	istat = 1;
	return istat;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -