2011-10-25 32 views
0

問候語,不移動和圍繞一個點旋轉三角形 - C Bgi圖形

我在BGI圖形中有此圖形功課。我們必須使用DevCPP和BGI以及矩陣。

我寫了這段代碼,我認爲轉換是好的。但我的三角形不會移動並圍繞圓圈旋轉,而且我不明白,爲什麼不圍繞圓圈移動...

我不知道我在哪裏以及要重寫什麼。

#include <math.h> 
#include "graphics.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <conio.h> 

#define PI 3.14159265 

typedef float Matrix3x3[3][3]; 
Matrix3x3 theMatrix; 

int Round(double n){ 
    return (int)(n + 0.5); 
} 

void matrix3x3SetIdentity(Matrix3x3 m) 
{ 
    int i, j; 
    for(i=0; i<3; i++) 
       for(j=0; j<3;j++) 
         m[i][j]=(i==j); 
} 

/* Multiplies matrix, result in b matrix */ 
void matrix3x3PreMultiply(Matrix3x3 a, Matrix3x3 b) 
{ 
    int r, c; 
    Matrix3x3 tmp; 

    for(r=0; r<3;r++) 
     for(c=0; c<3;c++) 
     tmp[r][c]= 
      a[r][0]*b[0][c]+a[r][1]*b[1][c]+a[r][2]*b[2][c]; 

    for(r=0; r<3;r++) 
     for(c=0; c<3; c++) 
     b[r][c]-tmp[r][c]; 

} 

void translate2(int tx, int ty) 
{ 
    Matrix3x3 m; 

    matrix3x3SetIdentity (m); 
    m[0][2] = tx; 
    m[1][2] = ty; 
    matrix3x3PreMultiply(m, theMatrix); 
} 

void scale2 (float sx, float sy, pont2d refpt) 
{ 
Matrix3x3 m; 
matrix3x3SetIdentity(m); 
m[0][0]=sx; 
m[0][2]=(1-sx)*refpt.x; 
m[1][1]=sy; 
m[1][2]=(1-sy)*refpt.y; 
matrix3x3PreMultiply(m, theMatrix); 
} 


void rotate2 (float a, pont2d refpt) 
{ 
    Matrix3x3 m; 
    matrix3x3SetIdentity(m); 
    a=a/PI; 
    m[0][0] = cosf(a); 
    m[0][1] = -sinf(a); 
    m[0][2] = refpt.x * (1-cosf(a)) + refpt.y * sinf(a); 
    m[1][0] = sinf (a); 
    m[1][1] = cosf (a); 
    m[1][2] = refpt.y * (1-cosf(a)) - refpt.x * sinf(a); 
    matrix3x3PreMultiply(m, theMatrix); 
} 

void transformPoints2 (int npts, pont2d *pts) 
{ 
    int k; 
    float tmp; 

    for (k = 0; k < npts; k++) { 
    tmp = theMatrix[0][0] * pts[k].x + theMatrix[0][1] * 
     pts[k].y + theMatrix[0][2]; 
    pts[k].y = theMatrix[1][0] * pts[k].x + theMatrix[1][1] * 
     pts[k].y + theMatrix[1][2]; 
    pts[k].x = tmp; 
    } 
} 


int main() 
{ 
int gd, gm, i, page=0; 
gd=VGA;gm=VGAHI; 
initgraph(&gd,&gm,""); 
int ap; 

while(!kbhit()) 
{ 
    setactivepage(page); 
    cleardevice(); 


    pont2d P[3] = { 50.0, 50.0, 150.0, 50.0, 100.0, 150.0}; 
    pont2d refPt = {200.0, 250.0}; 

    // Drawing the Triangle 
    moveto(Round(P[ 0 ].x), Round(P[ 0 ].y)); 
    for(i = 1; i < 3; i++) 
      lineto(Round(P[ i ].x), Round(P[ i ].y));   
    lineto(Round(P[ 0 ].x), Round(P[ 0 ].y)); 

    // Drawing the Circle 
    fillellipse(200, 250, 5,5); 
    setcolor (BLUE); 
    matrix3x3SetIdentity (theMatrix); 
    scale2 (0.5, 0.5, refPt); 
    //scale2 (20, 20, refPt); 
    rotate2 (90.0, refPt); 
    translate2 (0, 150); 
    transformPoints2 (3, P); 

    setvisualpage(page); 
    page = 1-page;  

} 

getch(); 

closegraph(); 

return 0; 

} 

回答

1

如果你想看到的物體「旋轉」,然後旋轉,應瞭解當地的起源進行。圍繞全局原點旋轉將導致物體「繞開」全局原點。因此,旋轉的物體:

  1. 翻譯的對象全局原點
  2. 應用旋轉
  3. 翻譯對象返回到原來的位置

看討論關於轉變爲了here爲例證。具體來說,請查看題爲「演示轉換順序重要性」的部分。

0

要旋轉的三角形,得到的三個點,並使用下式:

X '= X + R COS(THETA) Y'= Y - R的SIN(THETA)

上述公式可以應用到0到360之間的循環中。通過在循環中放置一個延遲(200)毫秒可以進行圖形仿真。