Example #1
0
//         3  2           T  3  2     T
//由M计算(u ,u ,u,1) H M H (w ,w ,w,1)
void CCoons:: uw(double M[][4],double Matrix[][4])
{

	double Temp[4][4];

	double Hermite[4][4]={

		{ 2 ,-2 , 1 , 1},
		{-3 , 3 ,-2 ,-1},
		{ 0 , 0 , 1 , 0},
		{ 1 , 0 , 0 , 0}

	};

	double HermiteT[4][4]={
		
		{ 2 ,-3 , 0 , 1},
		{-2 , 3 , 0 , 0},
		{ 1 ,-2 , 1 , 0},
		{ 1 ,-1 , 0 , 0}
		
	};

	MatMultiply(Hermite,4,M,Temp);

	MatMultiply(Temp,4,HermiteT,Matrix);

}
Example #2
0
 mat MatQuickPow(mat A,int n){
 	mat temp=E;
 	while(n){
 		if(n&1) temp=MatMultiply(temp,A);
 		n>>=1;
 		A=MatMultiply(A,A);
 	}
 	return temp;
 }
Example #3
0
static void make_transform_matrix(
		int transform_order, int rotate_order,
		double tx, double ty, double tz,
		double rx, double ry, double rz,
		double sx, double sy, double sz,
		double *transform)
{
	int i;
	double T[16], R[16], S[16], RX[16], RY[16], RZ[16];
	double *queue[3];

	MatTranslate(T, tx, ty, tz);
	MatRotateX(RX, rx);
	MatRotateY(RY, ry);
	MatRotateZ(RZ, rz);
	MatScale(S, sx, sy, sz);

	switch (rotate_order) {
	case ORDER_XYZ: VEC3_SET(queue, RX, RY, RZ); break;
	case ORDER_XZY: VEC3_SET(queue, RX, RZ, RY); break;
	case ORDER_YXZ: VEC3_SET(queue, RY, RX, RZ); break;
	case ORDER_YZX: VEC3_SET(queue, RY, RZ, RX); break;
	case ORDER_ZXY: VEC3_SET(queue, RZ, RX, RY); break;
	case ORDER_ZYX: VEC3_SET(queue, RZ, RY, RX); break;
	default:
		assert(!"invalid rotate order");
		break;
	}

	MatIdentity(R);
	for (i = 0; i < 3; i++)
		MatMultiply(R, queue[i], R);

	switch (transform_order) {
	case ORDER_SRT: VEC3_SET(queue, S, R, T); break;
	case ORDER_STR: VEC3_SET(queue, S, T, R); break;
	case ORDER_RST: VEC3_SET(queue, R, S, T); break;
	case ORDER_RTS: VEC3_SET(queue, R, T, S); break;
	case ORDER_TRS: VEC3_SET(queue, T, R, S); break;
	case ORDER_TSR: VEC3_SET(queue, T, S, R); break;
	default:
		assert(!"invalid transform order order");
		break;
	}

	MatIdentity(transform);
	for (i = 0; i < 3; i++)
		MatMultiply(transform, queue[i], transform);
}
Example #4
0
int main()
{
	int i,n,k,sum,max1,max2,a;
	E.m[0][0]=1;E.m[0][1]=0;
	E.m[1][0]=0;E.m[1][1]=1;
	A.m[0][0]=1;A.m[0][1]=1;
	A.m[1][0]=1;A.m[1][1]=0;
	while(scanf("%d%d",&n,&k)!=EOF){
		sum=max1=max2=0;
		for(i=1;i<=n;i++){
			scanf("%d",&a);
			if(a>max1){
				max2=max1;
				max1=a;
			}
			else if(a>max2) max2=a;
			sum+=a;
			sum%=p;
		}
	B=MatQuickPow(A,k+1);
	B.m[0][0]--;B.m[1][1]--;
	B=MatMultiply(B,A);
	sum=(B.m[0][0]*max1%p+B.m[1][0]*max2%p+sum-max1+p)%p;
	printf("%d\n",sum);
	}
 return 0;
}
Example #5
0
/*=========================
//  投影变换
//  参数:l,a
//
===========================*/
void C3DPoint::project(double l,double ct)
{
	double Temp1[1][4]={0,0,0,0};

	double M_b[4][4]={
		
		{1,0,0,0},
		{0,1,0,0},
		{l*cos(ct),l*sin(ct),0,0},
		{0,0,0,1}

	};

	MatMultiply (Matrix,1,M_b,Temp1);

	//Temp1->Matrix
    Matrix[0][0]=Temp1[0][0];
    Matrix[0][1]=Temp1[0][1];
    Matrix[0][2]=0;
	Matrix[0][3]=1;
}
Example #6
0
/*=========================
//	绕Z轴旋转
//
===========================*/
void C3DPoint::Roat_z(double ct)
{
	double Temp1[1][4]={0,0,0,0};
	
	double M_b[4][4]={
		
		{cos(ct),sin(ct),0,0},
		{-sin(ct),cos(ct),0,0},
		{0,0,1,0},
		{0,0,0,1}
		
	};
	
	MatMultiply (Matrix,1,M_b,Temp1);
	
	//Temp1->Matrix
    Matrix[0][0]=Temp1[0][0];
    Matrix[0][1]=Temp1[0][1];
    Matrix[0][2]=Temp1[0][2];
	Matrix[0][3]=Temp1[0][3];
}
Example #7
0
/*=========================
//  透视
//
===========================*/
void C3DPoint::perspect(double x0,double y0,double z0)
{
	double d=-z0;
	
	double Temp1[1][4]={0,0,0,0};

	double M_b[4][4]={
		
		{1,0,0,0},
		{0,1,0,0},
		{x0/d,y0/d,0,1/d}, 
		{0,0,0,1}

	};

	MatMultiply (Matrix,1,M_b,Temp1);

	//Temp1->Matrix
    Matrix[0][0]=Temp1[0][0]/Temp1[0][3];
    Matrix[0][1]=Temp1[0][1]/Temp1[0][3];
    Matrix[0][2]=0;
	Matrix[0][3]=1;
}
Example #8
0
/*=========================
//旋转变换
//参数:int x1,y1,z1,x2,y2,z2 旋转直线, int ct 旋转角度
===========================*/
void C3DPoint::Roat(int x1, int y1, int z1, int x2, int y2, int z2, double ct)
{

//求直线方向向量
    double a=x2-x1;
    double b=y2-y1;
    double c=z2-z1;

    double tt=sqrt(double(a*a+b*b+c*c));

    double n1=a/tt;
    double n2=b/tt;
    double n3=c/tt;
//(n1,n2,n3)

	double v=sqrt(n2*n2+n3*n3);

	//cosa
    double c_na=n3/v;
    double c_a=c_na;

	//sina
    double s_na=n2/v;
    double s_a=-s_na;

	//cosb
    double c_nb=v;
    double c_b=c_nb;

	//sinb
    double s_nb=-n1;
    double s_b=s_nb;

	//Rx(a)
	double R_X[4][4]={
		
		{1,0,0,0},
		{0,n3/v,n2/v,0},
		{0,-n2/v,n3/v,0},
		{0,0,0,1}

	};

	//Ry(B)
    double R_Y[4][4]={

        {v,0,n1,0},
        {0,1,0,0},
        {-n1,0,v,0},
        {0,0,0,1}

    };

	//Rz(o)
    double R_Z[4][4]={
    
        {cos(ct),sin(ct),0,0},
        {-sin(ct),cos(ct),0,0},
        {0,0,1,0},
        {0,0,0,1}
    
    };

	//Ry(-B)
    double R_NY[4][4]={

        {v,0,-n1,0},
        {0,1,0,0},
        {n1,0,v,0},
        {0,0,0,1}

    };

	//Rx(-a)
    double R_NX[4][4]={

        {1,0,0,0},
        {0,n3/v,-n2/v,0},
        {0,n2/v,n3/v,0},
        {0,0,0,1}

    };


    double Temp1[1][4]={0,0,0,0};
    double Temp2[1][4]={0,0,0,0};

//平移到原点
    Matrix[0][0]-=x1;
    Matrix[0][1]-=y1;
    Matrix[0][1]-=z1;
	
	MatMultiply (Matrix,1,R_X,Temp1);
	MatMultiply (Temp1,1,R_Y,Temp2);

	//backup Temp1
    Temp1[0][0]=0;
    Temp1[0][1]=0;
    Temp1[0][2]=0;
    Temp1[0][3]=0;

	MatMultiply (Temp2,1,R_Z,Temp1);

    Temp2[0][0]=0;
    Temp2[0][1]=0;
    Temp2[0][2]=0;
    Temp2[0][3]=0;

    MatMultiply (Temp1,1,R_NY,Temp2);

    Temp1[0][0]=0;
    Temp1[0][1]=0;
    Temp1[0][2]=0;
    Temp1[0][3]=0;

    MatMultiply (Temp2,1,R_NX,Temp1);

	//Temp1->Matrix
    Matrix[0][0]=Temp1[0][0];
    Matrix[0][1]=Temp1[0][1];
    Matrix[0][2]=Temp1[0][2];

//从原点平移回
    Matrix[0][0]+=x1;
    Matrix[0][1]+=y1;
    Matrix[0][2]+=z1;

}