/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: cube.c
*
* Copyright (C) 2002 Damien Teney
*
* All files in this archive are subject to the GNU General Public License.
* See the file COPYING in the source tree root for full license agreement.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include
#include "lcd.h"
#include "config.h"
#include "kernel.h"
#include "menu.h"
#include "button.h"
typedef struct
{int x,y,z;} point3D;
typedef struct
{int x,y;} point2D;
point3D Sommet[8];
point3D Point3D[8];
point2D Point2D[8];
int Nb_points = 8;
int Xoff = 56;
int Yoff = 95;
int Zoff = 600;
// Precalculated sine and cosine
float SinTable[360] =
{0.000000,0.017452,0.034899,0.052336,0.069756,0.087156,0.104528,0.121869,0.139173,0.156434,0.173648,0.190809,0.207912,0.224951,0.241922,0.258819,0.275637,0.292372,0.309017,0.325568,0.342020,0.358368,0.374607,0.390731,0.406737,0.422618,0.438371,0.453991,0.469472,0.484810,0.500000,0.515038,0.529919,0.544639,0.559193,0.573576,0.587785,0.601815,0.615661,0.629320,0.642788,0.656059,0.669131,0.681998,0.694658,0.707107,0.719340,0.731354,0.743145,0.754710,0.766044,0.777146,0.788011,0.798636,0.809017,0.819152,0.829038,0.838671,0.848048,0.857167,0.866025,0.874620,0.882948,0.891007,0.898794,0.906308,0.913545,0.920505,0.927184,0.933580,0.939693,0.945519,0.951057,0.956305,0.961262,0.965926,0.970296,0.974370,0.978148,0.981627,0.984808,0.987688,0.990268,0.992546,0.994522,0.996195,0.997564,0.998630,0.999391,0.999848,1.000000};
float Sin(int val)
{
if (val >= 0 && val <= 90) return SinTable[val]; //
quadrant I
else if (val > 90 && val <= 180) return SinTable[180-val]; //
quadrant II
else if (val > 180 && val <= 270) return (-1)*SinTable[val-180]; //
quadrant III
else if (val > 270 && val <= 360) return (-1)*SinTable[360-val]; //
quadrant IV
return SinTable[val];
}
float Cos(int val)
{
if (90-val < 0) return (-1)*Sin((90-val)*-1); // Test in order to not
call the Sin() function with a argument < 0
else return Sin(90-val);
}
float matrice[3][3];
void cube_rotate(int Xa, int Ya, int Za)
{
int i;
matrice[0][0] = Cos(Za)*Cos(Ya);
matrice[1][0] = Sin(Za)*Cos(Ya);
matrice[2][0] = -Sin(Ya);
matrice[0][1] = Cos(Za)*Sin(Ya)*Sin(Xa) - Sin(Za)*Cos(Xa);
matrice[1][1] = Sin(Za)*Sin(Ya)*Sin(Xa) + Cos(Xa)*Cos(Za);
matrice[2][1] = Sin(Xa)*Cos(Ya);
matrice[0][2] = Cos(Za)*Sin(Ya)*Cos(Xa) + Sin(Za)*Sin(Xa);
matrice[1][2] = Sin(Za)*Sin(Ya)*Cos(Xa) - Cos(Za)*Sin(Xa);
matrice[2][2] = Cos(Xa)*Cos(Ya);
for(i=0;i