/*************************************************************************** * __________ __ ___. * 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