繁体   English   中英

不会围绕点移动和旋转三角形-C Bgi graphics

[英]Doesn't move and rotate the triangle around a point - C Bgi graphics

问候语

我在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. 将对象转换为全球原点
  2. 应用旋转
  3. 将对象平移回其原始位置

此处查看有关转换顺序的讨论,以获取说明。 具体来说,请查找标题为“演示转换顺序的重要性”的部分。

要旋转三角形,请获得三个点并使用公式:

x'= x + r cos(theta)y'= y-r sin(theta)

上面的公式可以应用于0到360的循环中。您可以通过在循环中放置一个延迟(200)毫秒来进行图形仿真。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM