Vector RenderObject::getWorldCollidePosition(const Vector &vec) { #ifdef BBGE_USE_GLM glm::mat4 transformMatrix = glm::translate( matrixChain(this), glm::vec3(collidePosition.x + vec.x, collidePosition.y + vec.y, 0.0f) ); return Vector(transformMatrix[3][0], transformMatrix[3][1], 0); #else #ifdef BBGE_BUILD_OPENGL glPushMatrix(); glLoadIdentity(); matrixChain(this); glTranslatef(collidePosition.x+vec.x, collidePosition.y+vec.y, 0); float m[16]; glGetFloatv(GL_MODELVIEW_MATRIX, m); float x = m[12]; float y = m[13]; glPopMatrix(); return Vector(x,y,0); #elif BBGE_BUILD_DIRECTX return vec; #endif #endif }
int main () { int n; int q[2*N]; int p[N+1],flag=1; int m[N+1][N+1]; int s[N+1][N+1]; printf ("请输入矩阵的个数:"); scanf ("%d",&n); for (int i=0; i<=2*n-1; i++) { if (i%2==0) { printf ("***************\n"); printf ("请输入A%d的行:",(i/2)+1); } else { printf ("列***********:"); } scanf ("%d",&q[i]); } for (int i=1; i<=2*n-2; i++) { if (i%2!=0&&q[i]!=q[i+1]) { flag=0; break; } } for (int j=1; j<=n-1; j++) { p[j]=q[2*j]; } if (flag!=0) { p[0]=q[0]; p[n]=q[2*n-1]; matrixChain (p,m,s); printf ("式子如下:\n"); traceback(1,n,s); printf ("\n"); printf ("最小数乘次数为%d\n",m[1][n]); } else { printf ("这%d个矩阵不能连乘!\n",n); } return 0; }
static void matrixChain(RenderObject *ro) { if (RenderObject *parent = ro->getParent()) matrixChain(parent); #ifdef BBGE_BUILD_OPENGL glTranslatef(ro->position.x+ro->offset.x, ro->position.y+ro->offset.y, 0); glRotatef(ro->rotation.z+ro->rotationOffset.z, 0, 0, 1); glTranslatef(ro->beforeScaleOffset.x, ro->beforeScaleOffset.y, 0); glScalef(ro->scale.x, ro->scale.y, 0); if (ro->isfh()) { //glDisable(GL_CULL_FACE); glRotatef(180, 0, 1, 0); } glTranslatef(ro->internalOffset.x, ro->internalOffset.y, 0); #endif }
Vector RenderObject::getWorldCollidePosition(const Vector &vec) { #ifdef BBGE_BUILD_OPENGL glPushMatrix(); glLoadIdentity(); matrixChain(); glTranslatef(collidePosition.x+vec.x, collidePosition.y+vec.y, 0); float m[16]; glGetFloatv(GL_MODELVIEW_MATRIX, m); float x = m[12]; float y = m[13]; glPopMatrix(); return Vector(x,y,0); #elif BBGE_BUILD_DIRECTX return vec; #endif }
static glm::mat4 matrixChain(const RenderObject *ro) { glm::mat4 tranformMatrix = glm::scale( glm::translate( glm::rotate( glm::translate( ro->getParent() ? matrixChain(ro->getParent()) : glm::mat4(1.0f), glm::vec3(ro->position.x+ro->offset.x, ro->position.y+ro->offset.y, 0) ), ro->rotation.z + ro->rotationOffset.z, glm::vec3(0, 0, 1) ), glm::vec3(ro->beforeScaleOffset.x, ro->beforeScaleOffset.y, 0.0f) ), glm::vec3(ro->scale.x, ro->scale.y, 0.0f) ); if (ro->isfh()) tranformMatrix *= glm::rotate(180.0f, glm::vec3(0.0f, 1.0f, 0.0f)); tranformMatrix *= glm::translate(glm::vec3(ro->internalOffset.x, ro->internalOffset.y, 0.0f)); return tranformMatrix; }