如何在x11 / C中旋转矩形

时间:2017-01-16 16:25:38

标签: rotation x11 xlib

我应该开发一种用户用大炮射击球的游戏。为此,我需要能够旋转大炮(矩形)并从不同的角度拍摄。你能帮我吗?

干杯!

    typedef struct _Cannon {
    		int x, y, w, h;
    }Cannon;

typedef struct _Ball{
	int itx, ity; //size
	float ix, iy; //position
	float vx, vy; //velocity
	float gr; 	  //gravity
}Ball;

    Cannon cannon = {60, 400, 114, 33};
Ball ball = {
	0,0,
	cannon.x+cannon.w*0.8,cannon.y+cannon.h/5,
	17.0, 0,
	0.3
	};

    XSetForeground(XApp->getDisplay(), GCAtr->getGC(),
    GCAtr->getColor(2));
    XFillRectangle(XApp->getDisplay(), XApp->getWindow(), GCAtr->getGC(),cannon.x,cannon.y,cannon.w,cannon.h);
    
void calculate()
{
	double dt;
	dt = XApp->getDifTime();
	
	//Calculates the position of the ball
	ball.vy += ball.gr * dt;
	ball.iy += ball.vy * dt;
	ball.ix += ball.vx * dt;
}

Image of the game

1 个答案:

答案 0 :(得分:0)

XFillRectangle仅适用于轴平行矩形。对于任意旋转的矩形,请使用XFillPolygon

您需要自己计算旋转矩形的顶点坐标。这不是二维几何中线性变换的教程,但简单地说,您需要这样做:

  1. 以一个以(0,0)为中心的矩形开始。
  2. 使用旋转矩阵

    按角度θ应用旋转
            cos θ    sin θ 
           -sin θ    cos θ 
    

    到每个角落。这将旋转原点周围的角落。

  3. 通过添加矩形中心的坐标进行平移。