Partage
  • Partager sur Facebook
  • Partager sur Twitter

Atelier Cod'Art

29 octobre 2010 à 17:54:08

Sur internet pourquoi?

Sur les sources de QuickMan
  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
29 octobre 2010 à 19:56:05

Si tu réutilises le code d'un autre projet, il serait bon de le mentionner dans ton code (un commentaire pour le dire avec un lien vers le projet). Du reste, il me semble que QuickMan est sous GPL, et que tu devrais donc respecter toi aussi cette licence si tu distribues ton logiciel.
  • Partager sur Facebook
  • Partager sur Twitter
29 octobre 2010 à 20:09:27

Ha, Excuse moi, je vais édité alors ^^.
  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
31 octobre 2010 à 21:25:55

Bonjour a vous tous,

Etant donner qu'il y a beaucoup de mandelbrot en utilisant le complexe a + ib, je viens vous en présenter un utilisant l'algèbres des quaternions, qui sont des complexe de type a + ib+ jc+ kd

Cet algèbre n'est pas plus compliqué que les complexe normaux.

Voici 2 images

Le mandelbrot avec l'algèbre des quaternions
Image utilisateur


Le mandelbrot une fois zoomer


Voilà.

Cordialement
  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
Anonyme
1 novembre 2010 à 11:01:04

Sympa, surtout la deuxième, mais ça serais bien si tu donnais les codes (c'est le but de l'atelier).

Par contre, il y a un truc bizarre avec tes images qui se chargent (très lentement) en partant du bas.
  • Partager sur Facebook
  • Partager sur Twitter
1 novembre 2010 à 11:19:45

Citation : berdes1

Par contre, il y a un truc bizarre avec tes images qui se chargent (très lentement) en partant du bas.


Elles se chargent très lentement parce que c'est des bitmaps.

Franchement qnope c'est pas sympa pour les low-connections.
La prochaine fois, pense à PNG :)

Sinon c'est plutôt beau, bravo.
  • Partager sur Facebook
  • Partager sur Twitter
1 novembre 2010 à 12:30:38

Salut, alors le code

#include <SDL.h>
#include <stdio.h>
#include <SDL_thread.h>
#define BLANC 0x00ffffff

#define bool char
#define true 1
#define false 0
#define ITER_STEP 20

/*Cette palette est tirée de QuickMan*/

unsigned pal_0[] =
{
0x000000, 0x000000, 0x010101, 0x010101, 0x020202, 0x030303, 0x040404, 0x050505,
0x060606, 0x070707, 0x080808, 0x090909, 0x0A0A0A, 0x0B0B0B, 0x0C0C0C, 0x0D0D0D,
0x0E0E0E, 0x0F0F0F, 0x101010, 0x121212, 0x131313, 0x141414, 0x151515, 0x171717,
0x181818, 0x191919, 0x1B1B1B, 0x1C1C1C, 0x1E1E1E, 0x1F1F1F, 0x202020, 0x222222,
0x232323, 0x252525, 0x262626, 0x282828, 0x2A2A2A, 0x2B2B2B, 0x2D2D2D, 0x2E2E2E,
0x303030, 0x323232, 0x333333, 0x353535, 0x373737, 0x383838, 0x3A3A3A, 0x3C3C3C,
0x3E3E3E, 0x3F3F3F, 0x414141, 0x434343, 0x454545, 0x474747, 0x484848, 0x4A4A4A,
0x4C4C4C, 0x4E4E4E, 0x505050, 0x525252, 0x545454, 0x565656, 0x575757, 0x595959,
0x5B5B5B, 0x5D5D5D, 0x5F5F5F, 0x616161, 0x636363, 0x656565, 0x676767, 0x696969,
0x6B6B6B, 0x6D6D6D, 0x6F6F6F, 0x717171, 0x737373, 0x757575, 0x777777, 0x797979,
0x7B7B7B, 0x7D7D7D, 0x7F7F7F, 0x808080, 0x828282, 0x848484, 0x868686, 0x888888,
0x8A8A8A, 0x8C8C8C, 0x8E8E8E, 0x909090, 0x929292, 0x949494, 0x969696, 0x989898,
0x9A9A9A, 0x9C9C9C, 0x9E9E9E, 0xA0A0A0, 0xA2A2A2, 0xA3A3A3, 0xA5A5A5, 0xA7A7A7,
0xA9A9A9, 0xABABAB, 0xADADAD, 0xAFAFAF, 0xB1B1B1, 0xB2B2B2, 0xB4B4B4, 0xB6B6B6,
0xB8B8B8, 0xB9B9B9, 0xBBBBBB, 0xBDBDBD, 0xBFBFBF, 0xC0C0C0, 0xC2C2C2, 0xC4C4C4,
0xC5C5C5, 0xC7C7C7, 0xC9C9C9, 0xCACACA, 0xCCCCCC, 0xCECECE, 0xCFCFCF, 0xD1D1D1,
0xD2D2D2, 0xD4D4D4, 0xD5D5D5, 0xD7D7D7, 0xD8D8D8, 0xDADADA, 0xDBDBDB, 0xDCDCDC,
0xDEDEDE, 0xDFDFDF, 0xE0E0E0, 0xE2E2E2, 0xE3E3E3, 0xE4E4E4, 0xE5E5E5, 0xE7E7E7,
0xE8E8E8, 0xE9E9E9, 0xEAEAEA, 0xEBEBEB, 0xECECEC, 0xEDEDED, 0xEEEEEE, 0xEFEFEF,
0xF0F0F0, 0xF1F1F1, 0xF2F2F2, 0xF3F3F3, 0xF4F4F4, 0xF5F5F5, 0xF5F5F5, 0xF6F6F6,
0xF7F7F7, 0xF8F8F8, 0xF8F8F8, 0xF9F9F9, 0xF9F9F9, 0xFAFAFA, 0xFAFAFA, 0xFBFBFB,
0xFBFBFB, 0xFCFCFC, 0xFCFCFC, 0xFDFDFD, 0xFDFDFD, 0xFDFDFD, 0xFDFDFD, 0xFEFEFE,
0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFDFDFD, 0xFDFDFD,
0xFCFCFC, 0xFBFBFB, 0xFAFAFA, 0xF8F8F8, 0xF7F7F7, 0xF5F5F5, 0xF3F3F3, 0xF1F1F1,
0xEFEFEF, 0xECECEC, 0xEAEAEA, 0xE7E7E7, 0xE4E4E4, 0xE2E2E2, 0xDFDFDF, 0xDBDBDB,
0xD8D8D8, 0xD4D4D4, 0xD1D1D1, 0xCDCDCD, 0xCACACA, 0xC6C6C6, 0xC2C2C2, 0xBEBEBE,
0xBABABA, 0xB6B6B6, 0xB2B2B2, 0xADADAD, 0xA9A9A9, 0xA5A5A5, 0xA0A0A0, 0x9C9C9C,
0x989898, 0x939393, 0x8E8E8E, 0x8A8A8A, 0x858585, 0x818181, 0x7C7C7C, 0x777777,
0x737373, 0x6E6E6E, 0x6A6A6A, 0x656565, 0x616161, 0x5C5C5C, 0x585858, 0x535353,
0x4F4F4F, 0x4A4A4A, 0x464646, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x363636, 0x323232,
0x2E2E2E, 0x2A2A2A, 0x272727, 0x232323, 0x202020, 0x1D1D1D, 0x191919, 0x161616,
0x131313, 0x101010, 0x0E0E0E, 0x0B0B0B, 0x090909, 0x070707, 0x050505, 0x030303,
};

unsigned pal_1[] =
{
0x000000, 0x0C141C, 0x182838, 0x243C54, 0x305070, 0x3C648C, 0x4878A8, 0x548CC4,
0x60A0E0, 0x6CB4FC, 0x78C8E4, 0x84DCC8, 0x90F0AC, 0x9CF890, 0xA8E474, 0xB4D058,
0xC0BC3C, 0xCCA820, 0xD89404, 0xE48014, 0xF06C30, 0xFC584C, 0xF44468, 0xE83084,
0xDC1CA0, 0xD008BC, 0xC408D8, 0xB81CF4, 0xAC30EC, 0xA044D0, 0x9458B4, 0x886C98,
0x7C807C, 0x709460, 0x64A844, 0x58BC28, 0x4CD00C, 0x40E40C, 0x34F828, 0x28F044,
0x1CDC60, 0x10C87C, 0x04B498, 0x04A0B4, 0x108CD0, 0x1C78EC, 0x2864F4, 0x3450D8,
0x403CBC, 0x4C28A0, 0x581484, 0x640068, 0x70104C, 0x7C2430, 0x883814, 0x944C04,
0xA06020, 0xAC743C, 0xB88858, 0xC49C74, 0xD0B090, 0xDCC4AC, 0xE8D8C8, 0xF4ECE4,
0x287C80, 0x887090, 0x3864A0, 0x9858B0, 0x484CC0, 0xA840D0, 0x5834E0, 0xB828F0,
0x681CFC, 0xC810EC, 0x7804DC, 0xD804CC, 0x8810BC, 0xE81CAC, 0x98289C, 0xF8348C,
0xA8407C, 0xF44C6C, 0xB8585C, 0xE4644C, 0xC8703C, 0xD47C2C, 0xD8881C, 0xC4940C,
0xE8A000, 0xB4AC10, 0xF8B820, 0xA4C430, 0xF4D040, 0x94DC50, 0xE4E860, 0x84F470,
0xD4FC80, 0x74F090, 0xC4E4A0, 0x64D8B0, 0xB4CCC0, 0x54C0D0, 0xA4B4E0, 0x44A8F0,
0x949CFC, 0x3490EC, 0x8484DC, 0x2478CC, 0x746CBC, 0x1460AC, 0x64549C, 0x04488C,
0x543C7C, 0x08306C, 0x44245C, 0x18184C, 0x340C3C, 0x28002C, 0x24081C, 0x38140C,
0x142000, 0x482C10, 0x043820, 0x584430, 0x085040, 0x685C50, 0x186860, 0x787470,
0x000000, 0x08080C, 0x101018, 0x181824, 0x202030, 0x28283C, 0x303048, 0x383854,
0x404060, 0x48486C, 0x505078, 0x585884, 0x606090, 0x68689C, 0x7070A8, 0x7878B4,
0x8080C0, 0x8888CC, 0x9090D8, 0x9898E4, 0xA0A0F0, 0xA8A8FC, 0xB0B0F4, 0xB8B8E8,
0xC0C0DC, 0xC8C8D0, 0xD0D0C4, 0xD8D8B8, 0xE0E0AC, 0xE8E8A0, 0xF0F094, 0xF8F888,
0xFCFC7C, 0xF4F470, 0xECEC64, 0xE4E458, 0xDCDC4C, 0xD4D440, 0xCCCC34, 0xC4C428,
0xBCBC1C, 0xB4B410, 0xACAC04, 0xA4A404, 0x9C9C10, 0x94941C, 0x8C8C28, 0x848434,
0x7C7C40, 0x74744C, 0x6C6C58, 0x646464, 0x5C5C70, 0x54547C, 0x4C4C88, 0x444494,
0x3C3CA0, 0x3434AC, 0x2C2CB8, 0x2424C4, 0x1C1CD0, 0x1414DC, 0x0C0CE8, 0x0404F4,
0x4850B4, 0x3CBCBC, 0x3060C4, 0x24CCCC, 0x1870D4, 0x0CDCDC, 0x0080E4, 0x08ECEC,
0x1490F4, 0x20FCFC, 0x2CA0F8, 0x38F0F0, 0x44B0E8, 0x50E0E0, 0x5CC0D8, 0x68D0D0,
0x74D0C8, 0x80C0C0, 0x8CE0B8, 0x98B0B0, 0xA4F0A8, 0xB0A0A0, 0xBCFC98, 0xC89090,
0xD4EC88, 0xE08080, 0xECDC78, 0xF87070, 0xF8CC68, 0xEC6060, 0xE0BC58, 0xD45050,
0xC8AC48, 0xBC4040, 0xB09C38, 0xA43030, 0x988C28, 0x8C2020, 0x807C18, 0x741010,
0x686C08, 0x5C0000, 0x505C04, 0x440C0C, 0x384C14, 0x2C1C1C, 0x203C24, 0x142C2C,
0x082C34, 0x003C3C, 0x0C1C44, 0x184C4C, 0x240C54, 0x305C5C, 0x3C0064, 0x486C6C,
0x541074, 0x607C7C, 0x6C2084, 0x788C8C, 0x843094, 0x909C9C, 0x9C40A4, 0xA8ACAC,
};

unsigned pal_2[] =
{
0x000000, 0x0D0606, 0x160707, 0x1F0707, 0x2B0808, 0x360808, 0x430808, 0x510909,
0x5E0909, 0x6C0909, 0x790808, 0x880909, 0x940808, 0xA10808, 0xAC0707, 0xB70606,
0xC10606, 0xCA0505, 0xD20505, 0xD90404, 0xE00404, 0xE50303, 0xEA0303, 0xEE0303,
0xF10202, 0xF40202, 0xF80101, 0xFC0101, 0xFE0000, 0xFF0000, 0xFF0000, 0xFF0100,
0xFF0400, 0xFF0800, 0xFF0C00, 0xFF1100, 0xFF1600, 0xFF1C00, 0xFF2200, 0xFF2800,
0xFF2E00, 0xFF3500, 0xFF3C00, 0xFF4300, 0xFF4A00, 0xFF5200, 0xFF5900, 0xFF6100,
0xFF6900, 0xFF7100, 0xFF7900, 0xFF8100, 0xFF8800, 0xFF9000, 0xFF9800, 0xFFA000,
0xFFA700, 0xFFAF00, 0xFFB600, 0xFFBD00, 0xFFC400, 0xFFCB00, 0xFFD100, 0xFFD700,
0xFFDD00, 0xFFE200, 0xFFE800, 0xFFEC00, 0xFFF000, 0xFFF400, 0xFFF800, 0xFFFA00,
0xFEFC00, 0xFBFC01, 0xF7FC01, 0xF3FC02, 0xEFFC03, 0xEAFC03, 0xE5FC04, 0xE0FC05,
0xDBFC05, 0xD5FC06, 0xCFFC07, 0xC9FC07, 0xC2FC08, 0xBCFA09, 0xB5F80A, 0xAEF60A,
0xA7F30B, 0xA0F10C, 0x99EE0D, 0x92EB0E, 0x8AE90F, 0x83E610, 0x7CE311, 0x74E012,
0x6DDD13, 0x66DA15, 0x5FD716, 0x58D417, 0x51D119, 0x4ACE1A, 0x43CB1C, 0x3DC81E,
0x36C61F, 0x30C321, 0x2AC123, 0x24BE25, 0x1FBC27, 0x1ABA29, 0x15B92C, 0x10B72E,
0x0CB631, 0x08B533, 0x04B436, 0x01B439, 0x00B43C, 0x00B43F, 0x00B442, 0x00B546,
0x00B64A, 0x00B74E, 0x00B852, 0x00B956, 0x00BB5B, 0x00BC60, 0x00BE65, 0x00C06A,
0x00C26F, 0x00C474, 0x00C679, 0x00C87F, 0x00CA84, 0x00CD8A, 0x00CF8F, 0x00D195,
0x00D49A, 0x00D6A0, 0x00D8A5, 0x00DBAD, 0x00DFB5, 0x00E2BD, 0x00E5C5, 0x00E7CC,
0x00EAD3, 0x00EADA, 0x00EAE0, 0x00EAE6, 0x00EAEC, 0x00EAF1, 0x00EAF5, 0x00EAF9,
0x00EAFC, 0x00EAFE, 0x00E9FF, 0x00E4FF, 0x00DFFF, 0x00D9FF, 0x00D2FD, 0x00CAFA,
0x00C2F6, 0x00B9F2, 0x00B0EE, 0x00A6E9, 0x009BE3, 0x0091DD, 0x0086D7, 0x007BD1,
0x0075CD, 0x006FCA, 0x0069C6, 0x0063C3, 0x005DBF, 0x0057BC, 0x0052B9, 0x004CB5,
0x0047B2, 0x0041AF, 0x003CAC, 0x0036A9, 0x0031A6, 0x002CA3, 0x0028A1, 0x00239E,
0x001F9C, 0x001A9A, 0x001698, 0x001396, 0x000F94, 0x000C93, 0x000992, 0x000691,
0x000390, 0x030190, 0x070090, 0x0C0090, 0x100090, 0x150090, 0x1B0090, 0x210090,
0x270091, 0x2D0092, 0x340093, 0x3B0094, 0x420096, 0x490097, 0x510099, 0x59009B,
0x60009C, 0x68009E, 0x7000A0, 0x7800A2, 0x8000A4, 0x8C00A7, 0x9800AA, 0xA400AE,
0xAF00B1, 0xBA00B4, 0xC500B7, 0xCF00BA, 0xD900BC, 0xE200BF, 0xEA00C1, 0xF200C3,
0xF800C4, 0xFE00C6, 0xFD01C5, 0xFB04C3, 0xF806C1, 0xF606C0, 0xF507BF, 0xF207BE,
0xF008BC, 0xED09BA, 0xEB0AB8, 0xE70BB6, 0xE30BB3, 0xDE0CAF, 0xD90DAC, 0xD30EA7,
0xCB0FA1, 0xC2119A, 0xB81293, 0xAD138A, 0xA01381, 0x931477, 0x86156C, 0x781462,
0x6A1457, 0x5B134B, 0x4D1240, 0x401136, 0x33102B, 0x260E21, 0x1B0C18, 0x120B10,
};

unsigned pal_3[] =
{
0x000000, 0x184048, 0x141C54, 0x101850, 0x141C4C, 0x1C204C, 0x242448, 0x2C2848,
0x302C44, 0x383044, 0x403444, 0x483840, 0x4C3C40, 0x54403C, 0x5C443C, 0x58483C,
0x584C40, 0x585040, 0x545444, 0x545844, 0x545C48, 0x50604C, 0x4C6450, 0x486854,
0x446C58, 0x40705C, 0x3C7864, 0x307C6C, 0x347C68, 0x3C8064, 0x448460, 0x488860,
0x508C5C, 0x588C58, 0x609054, 0x649454, 0x6C9850, 0x749C4C, 0x80A048, 0x8CA448,
0x98A844, 0xA4AC44, 0xB0B040, 0xBCB440, 0xCCB840, 0xDCBC40, 0xE8C03C, 0xF8C43C,
0xF8C444, 0xF8CC50, 0xF8CC58, 0xF8D468, 0xF4CC64, 0xF4C860, 0xF4C45C, 0xF4C05C,
0xF4BC58, 0xF4B454, 0xF4B050, 0xF4AC50, 0xF4A84C, 0xF4A448, 0xF49C48, 0xF49844,
0xF49440, 0xF4903C, 0xF48C3C, 0xF48438, 0xF48034, 0xF47C34, 0xF47830, 0xF4742C,
0xF46C28, 0xF46828, 0xF46424, 0xF46020, 0xF45C1C, 0xF4541C, 0xF45018, 0xF44C14,
0xF44814, 0xF44410, 0xF43C0C, 0xF43808, 0xF43408, 0xF43004, 0xF42C00, 0xEC2C00,
0xE82C00, 0xE42C04, 0xDC3004, 0xD83008, 0xD43008, 0xCC2C08, 0xC42C08, 0xBC2C08,
0xB42808, 0xAC2808, 0xA42808, 0xA02408, 0x982408, 0x902408, 0x882008, 0x802008,
0x782008, 0x701C08, 0x6C1C08, 0x641808, 0x5C1808, 0x541808, 0x4C1408, 0x441408,
0x3C1408, 0x381408, 0x301008, 0x281008, 0x201008, 0x180C08, 0x18100C, 0x1C1810,
0x1C1C14, 0x1C2018, 0x20241C, 0x202820, 0x243028, 0x242C28, 0x202828, 0x1C2428,
0x182028, 0x141C28, 0x101828, 0x101428, 0x0C1028, 0x080C28, 0x040828, 0x040828,
0x040828, 0x080C28, 0x0C1028, 0x10142C, 0x18182C, 0x1C1C30, 0x202030, 0x282434,
0x2C2838, 0x303038, 0x38343C, 0x3C383C, 0x403C40, 0x484044, 0x4C4444, 0x504848,
0x544C48, 0x5C544C, 0x605850, 0x645C50, 0x6C6054, 0x706454, 0x746858, 0x7C6C58,
0x80705C, 0x887860, 0x8C7C60, 0x908064, 0x988464, 0x9C8868, 0xA08C6C, 0xA8906C,
0xAC9470, 0xB09C70, 0xB8A074, 0xBCA478, 0xC0A878, 0xC8AC7C, 0xCCB07C, 0xD0B480,
0xD8BC84, 0xDCC088, 0xE0C488, 0xE8C88C, 0xECCC8C, 0xECC488, 0xE8C084, 0xE8BC80,
0xE8B880, 0xE8B47C, 0xE4B07C, 0xE4AC78, 0xE4AC78, 0xE4A874, 0xE4A474, 0xE0A070,
0xE09C70, 0xE0986C, 0xE0946C, 0xDC9468, 0xDC9068, 0xDC8C64, 0xDC8864, 0xDC8460,
0xD88060, 0xD8805C, 0xD87C5C, 0xD87858, 0xD87454, 0xD47054, 0xD46C50, 0xD46850,
0xD4684C, 0xD0644C, 0xD06048, 0xD05C48, 0xD05844, 0xD05444, 0xCC5440, 0xCC5040,
0xCC4C3C, 0xCC483C, 0xC84438, 0xC84038, 0xC83C34, 0xC83C34, 0xC83830, 0xC43430,
0xC4302C, 0xBC2C28, 0xB82C28, 0xB42C28, 0xB02C28, 0xAC2C28, 0xA82C28, 0xA42C28,
0x9C2C28, 0x982C28, 0x942C28, 0x902C28, 0x8C2828, 0x882828, 0x842828, 0x802828,
0x782828, 0x742828, 0x702828, 0x6C2828, 0x682828, 0x642828, 0x602828, 0x5C2828,
0x543028, 0x4C342C, 0x3C3828, 0x304024, 0x244820, 0x205820, 0x1C6814, 0x288834,
};

unsigned pal_4[] =
{
0x000000, 0x80087C, 0x7C0874, 0x780870, 0x740868, 0x740864, 0x700860, 0x6C0858,
0x680854, 0x68084C, 0x640848, 0x600C44, 0x600C3C, 0x5C0C38, 0x580C34, 0x541030,
0x54102C, 0x501028, 0x4C1024, 0x4C1420, 0x48141C, 0x441818, 0x441814, 0x401810,
0x3C1C10, 0x3C1C0C, 0x38200C, 0x342008, 0x342408, 0x302408, 0x302808, 0x2C2808,
0x2C2C04, 0x282C08, 0x283008, 0x243008, 0x243408, 0x203408, 0x20380C, 0x1C3C0C,
0x1C3C10, 0x184010, 0x184414, 0x184418, 0x14481C, 0x144C20, 0x104C24, 0x105028,
0x10542C, 0x105430, 0x0C5834, 0x0C5C38, 0x0C603C, 0x0C6044, 0x086448, 0x08684C,
0x086854, 0x086C58, 0x087060, 0x087464, 0x087468, 0x087870, 0x087C74, 0x08807C,
0x048080, 0x088084, 0x08848C, 0x088890, 0x088C98, 0x088C9C, 0x0890A0, 0x0894A8,
0x0898AC, 0x0898B4, 0x089CB8, 0x0CA0BC, 0x0CA0C4, 0x0CA4C8, 0x0CA8CC, 0x10ACD0,
0x10ACD4, 0x10B0D8, 0x10B4DC, 0x14B4E0, 0x14B8E4, 0x18BCE8, 0x18BCEC, 0x18C0F0,
0x1CC4F0, 0x1CC4F4, 0x20C8F4, 0x20CCF8, 0x24CCF8, 0x24D0F8, 0x28D0F8, 0x28D4F8,
0x2CD4FC, 0x2CD8F8, 0x30D8F8, 0x30DCF8, 0x34DCF8, 0x34E0F8, 0x38E0F4, 0x3CE4F4,
0x3CE4F0, 0x40E8F0, 0x44E8EC, 0x44E8E8, 0x48ECE4, 0x4CECE0, 0x4CF0DC, 0x50F0D8,
0x54F0D4, 0x54F0D0, 0x58F4CC, 0x5CF4C8, 0x60F4C4, 0x60F4BC, 0x64F8B8, 0x68F8B4,
0x68F8AC, 0x6CF8A8, 0x70F8A0, 0x74F89C, 0x74F898, 0x78F890, 0x7CF88C, 0x80F884,
0x80FC80, 0x80F87C, 0x84F874, 0x88F870, 0x8CF868, 0x8CF864, 0x90F860, 0x94F858,
0x98F854, 0x98F84C, 0x9CF848, 0xA0F444, 0xA0F43C, 0xA4F438, 0xA8F434, 0xACF030,
0xACF02C, 0xB0F028, 0xB4F024, 0xB4EC20, 0xB8EC1C, 0xBCE818, 0xBCE814, 0xC0E810,
0xC4E410, 0xC4E40C, 0xC8E00C, 0xCCE008, 0xCCDC08, 0xD0DC08, 0xD0D808, 0xD4D808,
0xD4D404, 0xD8D408, 0xD8D008, 0xDCD008, 0xDCCC08, 0xE0CC08, 0xE0C80C, 0xE4C40C,
0xE4C410, 0xE8C010, 0xE8BC14, 0xE8BC18, 0xECB81C, 0xECB420, 0xF0B424, 0xF0B028,
0xF0AC2C, 0xF0AC30, 0xF4A834, 0xF4A438, 0xF4A03C, 0xF4A044, 0xF89C48, 0xF8984C,
0xF89854, 0xF89458, 0xF89060, 0xF88C64, 0xF88C68, 0xF88870, 0xF88474, 0xF8807C,
0xFC8080, 0xF88084, 0xF87C8C, 0xF87890, 0xF87498, 0xF8749C, 0xF870A0, 0xF86CA8,
0xF868AC, 0xF868B4, 0xF864B8, 0xF460BC, 0xF460C4, 0xF45CC8, 0xF458CC, 0xF054D0,
0xF054D4, 0xF050D8, 0xF04CDC, 0xEC4CE0, 0xEC48E4, 0xE844E8, 0xE844EC, 0xE840F0,
0xE43CF0, 0xE43CF4, 0xE038F4, 0xE034F8, 0xDC34F8, 0xDC30F8, 0xD830F8, 0xD82CF8,
0xD42CFC, 0xD428F8, 0xD028F8, 0xD024F8, 0xCC24F8, 0xCC20F8, 0xC820F4, 0xC41CF4,
0xC41CF0, 0xC018F0, 0xBC18EC, 0xBC18E8, 0xB814E4, 0xB414E0, 0xB410DC, 0xB010D8,
0xAC10D4, 0xAC10D0, 0xA80CCC, 0xA40CC8, 0xA00CC4, 0xA00CBC, 0x9C08B8, 0x9808B4,
0x9808AC, 0x9408A8, 0x9008A0, 0x8C089C, 0x8C0898, 0x880890, 0x84088C, 0x800884,
};

unsigned pal_5[] =
{
0x000000, 0x010101, 0x010101, 0x010101, 0x010101, 0x030201, 0x030201, 0x040301,
0x040301, 0x040301, 0x060401, 0x060401, 0x070501, 0x090601, 0x090601, 0x090601,
0x0A0701, 0x0A0701, 0x0B0801, 0x0D0901, 0x0D0901, 0x0E0A01, 0x100B01, 0x100B01,
0x110C01, 0x110C01, 0x130D01, 0x140E01, 0x150F01, 0x171001, 0x171001, 0x171001,
0x181101, 0x1A1201, 0x1B1301, 0x1D1401, 0x1E1501, 0x201601, 0x211701, 0x211701,
0x221801, 0x241901, 0x241901, 0x251A01, 0x271B01, 0x281C01, 0x2A1D01, 0x2B1E01,
0x2B1E01, 0x2C1F01, 0x2E2001, 0x2F2101, 0x312201, 0x322301, 0x342401, 0x352501,
0x382701, 0x392801, 0x3B2901, 0x3C2A01, 0x3C2A01, 0x3E2B01, 0x3F2B00, 0x412D02,
0x422E03, 0x432F04, 0x443005, 0x453106, 0x463207, 0x483409, 0x49350A, 0x4A360B,
0x4B370C, 0x4C380D, 0x4E3A0F, 0x4F3B10, 0x503C11, 0x513D12, 0x533F14, 0x533F14,
0x544015, 0x554116, 0x574318, 0x584419, 0x59451A, 0x5A461B, 0x5C481D, 0x5D491E,
0x5E4A1F, 0x5F4B20, 0x604C21, 0x614D22, 0x634F24, 0x645025, 0x655126, 0x665227,
0x685429, 0x69552A, 0x6A562B, 0x6C582D, 0x6D592E, 0x6E5A2F, 0x705C31, 0x715D32,
0x725E33, 0x746035, 0x756136, 0x766237, 0x786439, 0x79653A, 0x7A663B, 0x7C683D,
0x7D693E, 0x7E6A3F, 0x806C41, 0x816D42, 0x826E43, 0x847045, 0x857146, 0x887449,
0x89754A, 0x8A764B, 0x8B774C, 0x8D794E, 0x8E7A4F, 0x907C51, 0x907C51, 0x917D52,
0x937F54, 0x948055, 0x958156, 0x978358, 0x988459, 0x99855A, 0x9A865B, 0x9C885D,
0x9D895E, 0x9E8A5F, 0xA08C61, 0xA18D62, 0xA38F64, 0xA59166, 0xA69267, 0xA79368,
0xA9956A, 0xAA966B, 0xAB976C, 0xAC986D, 0xAE9A6F, 0xAF9B70, 0xB09C71, 0xB29E73,
0xB39F74, 0xB4A075, 0xB5A176, 0xB8A479, 0xB9A57A, 0xBAA67B, 0xBBA77C, 0xBDA97E,
0xBEAA7F, 0xBFAB80, 0xC0AC81, 0xC1AD82, 0xC2AE83, 0xC3AF84, 0xC4B085, 0xC5B186,
0xC6B287, 0xC9B58A, 0xCAB68B, 0xCBB78C, 0xCCB88D, 0xCDB98E, 0xCEBA8F, 0xD0BC91,
0xD1BD92, 0xD2BE93, 0xD3BF94, 0xD4C095, 0xD5C196, 0xD7C398, 0xD8C499, 0xD9C59A,
0xDAC69B, 0xDBC79C, 0xDCC89D, 0xDDC99E, 0xDFCBA0, 0xE0CCA1, 0xE1CDA2, 0xE2CEA3,
0xE3CFA4, 0xE5D1A6, 0xE6D2A7, 0xE7D3A8, 0xE7D3A8, 0xE8D4A9, 0xE9D5AA, 0xEAD6AB,
0xEBD7AC, 0xECD8AD, 0xEDD9AE, 0xEEDAAF, 0xEFDBB0, 0xF0DCB1, 0xF0DCB1, 0xF2DEB3,
0xF3DFB4, 0xF4E0B5, 0xF4E0B5, 0xF4E0B5, 0xF5E1B6, 0xF6E2B7, 0xF7E3B8, 0xF7E3B8,
0xF8E4B9, 0xF9E5BA, 0xFAE6BB, 0xFAE6BB, 0xFBE7BC, 0xFDE9BE, 0xFDE9BE, 0xFEEABF,
0xFFEBC0, 0xFFEBC0, 0xFFEDC4, 0xFFEDC4, 0xFFEEC8, 0xFFEEC8, 0xFFEFCB, 0xFFF0CE,
0xFFF0CE, 0xFFF1D2, 0xFFF1D2, 0xFFF1D2, 0xFFF2D5, 0xFFF2D5, 0xFFF3D8, 0xFFF3D8,
0xFFF5DF, 0xFFF5DF, 0xFFF5DF, 0xFFF6E2, 0xFFF6E2, 0xFFF6E2, 0xFFF7E5, 0xFFF7E5,
0xFFF7E5, 0xFFF7E5, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9,
0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC,
0xFFF9EC, 0xFFF9EC, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF7E5, 0xFFF6E2, 0xFFF6E2,
0xFFF5DF, 0xFFF3D8, 0xFFF2D5, 0xFFF1D2, 0xFFF0CE, 0xFFEEC8, 0xFFEDC4, 0xFFEBC0,
0xFDE9BE, 0xFBE7BC, 0xF9E5BA, 0xF7E3B8, 0xF5E1B6, 0xF4E0B5, 0xF3DFB4, 0xF0DCB1,
0xEEDAAF, 0xECD8AD, 0xEAD6AB, 0xE8D4A9, 0xE5D1A6, 0xE2CEA3, 0xE0CCA1, 0xDDC99E,
0xDBC79C, 0xD8C499, 0xD5C196, 0xD2BE93, 0xD0BC91, 0xCDB98E, 0xCAB68B, 0xC8B489,
0xC4B085, 0xC2AE83, 0xBFAB80, 0xBCA87D, 0xBAA67B, 0xB6A277, 0xB39F74, 0xB09C71,
0xAD996E, 0xAA966B, 0xA79368, 0xA49065, 0xA08C61, 0x9D895E, 0x9A865B, 0x978358,
0x937F54, 0x907C51, 0x8E7A4F, 0x8B774C, 0x887449, 0x847045, 0x816D42, 0x7E6A3F,
0x7B673C, 0x776338, 0x746035, 0x715D32, 0x6E5A2F, 0x6B572C, 0x685429, 0x655126,
0x624E23, 0x5F4B20, 0x5D491E, 0x5A461B, 0x574318, 0x544015, 0x523E13, 0x4F3B10,
0x4C380D, 0x49350A, 0x473308, 0x443005, 0x412D02, 0x3E2B01, 0x3C2A01, 0x382701,
0x352501, 0x312201, 0x2E2001, 0x2B1E01, 0x281C01, 0x251A01, 0x221801, 0x211701,
0x1E1501, 0x1B1301, 0x181101, 0x171001, 0x140E01, 0x110C01, 0x100B01, 0x0D0901,
0x0B0801, 0x090601, 0x090601, 0x060401, 0x040301, 0x030201, 0x010101, 0x010101,
};

unsigned pal_6[] =
{
0x000000, 0xB8A074, 0xBCA478, 0xC0A878, 0xC8AC7C, 0xCCB07C, 0xD0B480, 0xD8BC84,
0xDCC088, 0xE0C488, 0xE8C88C, 0xECCC8C, 0xECC488, 0xE8C084, 0xE8BC80, 0xE8B880,
0xE8B47C, 0xE4B07C, 0xE4AC78, 0xE4AC78, 0xE4A874, 0xE4A474, 0xE0A070, 0xE09C70,
0xE0986C, 0xE0946C, 0xDC9468, 0xDC9068, 0xDC8C64, 0xDC8864, 0xDC8460, 0xD88060,
0xD8805C, 0xD87C5C, 0xD87858, 0xD87454, 0xD47054, 0xD46C50, 0xD0684C, 0xCC684C,
0xC8684C, 0xC8644C, 0xC4644C, 0xC0644C, 0xC06048, 0xBC6048, 0xB86048, 0xB85C48,
0xB45C48, 0xB05C48, 0xAC5844, 0xAC5844, 0xA85844, 0xA45444, 0xA45444, 0xA05444,
0x9C5040, 0x9C5040, 0x985040, 0x944C40, 0x944C40, 0x904C40, 0x8C483C, 0x88483C,
0x88483C, 0x84443C, 0x80443C, 0x80443C, 0x784038, 0x743C38, 0x6C3C34, 0x683834,
0x643430, 0x5C3430, 0x58302C, 0x542C2C, 0x4C2C28, 0x482828, 0x402824, 0x3C2424,
0x382020, 0x302020, 0x2C1C1C, 0x28181C, 0x201818, 0x1C1418, 0x181418, 0x1C1818,
0x201C1C, 0x24201C, 0x282420, 0x2C2824, 0x302C28, 0x38302C, 0x3C342C, 0x403830,
0x443C34, 0x484038, 0x50443C, 0x50443C, 0x50483C, 0x50483C, 0x504C40, 0x504C40,
0x505040, 0x545444, 0x545844, 0x545C48, 0x50604C, 0x4C6450, 0x486854, 0x446C58,
0x40705C, 0x3C7864, 0x307C6C, 0x347C68, 0x3C8064, 0x448460, 0x488860, 0x508C5C,
0x588C58, 0x609054, 0x649454, 0x6C9850, 0x749C4C, 0x80A048, 0x8CA448, 0x98A844,
0xA4AC44, 0xB0B040, 0xBCB440, 0xCCB840, 0xDCBC40, 0xE8C03C, 0xF8C43C, 0xF8C444,
0xF8CC50, 0xF8CC58, 0xF8D468, 0xF4CC64, 0xF4C860, 0xF4C45C, 0xF4C05C, 0xF4BC58,
0xF4B454, 0xF0B050, 0xECAC50, 0xECA84C, 0xE8A44C, 0xE8A04C, 0xE49C48, 0xE49848,
0xE09448, 0xDC9044, 0xDC8C44, 0xD88844, 0xD88440, 0xD48040, 0xD47C40, 0xD0783C,
0xD0743C, 0xCC703C, 0xC86C38, 0xC86838, 0xC46434, 0xC46034, 0xC05C34, 0xC05830,
0xBC5430, 0xBC5030, 0xB84C2C, 0xB4482C, 0xB4442C, 0xB04028, 0xB03C28, 0xAC3828,
0xAC3424, 0xA83024, 0xA02C24, 0x982C28, 0x942C28, 0x8C282C, 0x88282C, 0x802830,
0x7C2430, 0x742434, 0x702438, 0x6C2434, 0x682434, 0x642434, 0x602030, 0x5C2030,
0x5C2030, 0x58202C, 0x54202C, 0x50202C, 0x4C2028, 0x4C2028, 0x482028, 0x441C24,
0x401C24, 0x3C1C24, 0x381C20, 0x381C20, 0x341C20, 0x301C1C, 0x2C1C1C, 0x281C1C,
0x281C1C, 0x281C18, 0x281C14, 0x281C14, 0x2C1C18, 0x2C2018, 0x2C201C, 0x30201C,
0x30201C, 0x30201C, 0x342420, 0x342420, 0x342420, 0x382824, 0x382824, 0x3C2C28,
0x3C3028, 0x40302C, 0x40342C, 0x443430, 0x443830, 0x483C34, 0x483C34, 0x4C4038,
0x4C4038, 0x50443C, 0x50483C, 0x544840, 0x544C40, 0x584C44, 0x585044, 0x5C5448,
0x5C5448, 0x60584C, 0x645C50, 0x6C6054, 0x706454, 0x746858, 0x7C6C58, 0x80705C,
0x887860, 0x8C7C60, 0x908064, 0x988464, 0x9C8868, 0xA08C6C, 0xA8906C, 0xAC9470,
};

unsigned pal_7[] =
{
0x000000, 0x030100, 0x0C0201, 0x1C0503, 0x320806, 0x4D0E0A, 0x73140F, 0x9E1A13,
0xCC2318, 0xFF2B20, 0xFF3827, 0xFF4430, 0xFF513B, 0xFF6146, 0xFF7051, 0xFF825E,
0xFF946B, 0xFFA87C, 0xFFAF7F, 0xFF9B70, 0xFF8863, 0xFF7956, 0xFF6B4D, 0xFF5C42,
0xFF4D38, 0xFF4230, 0xFF3627, 0xFF2D20, 0xC52117, 0x881611, 0x58100B, 0x340906,
0x180403, 0x080101, 0x000000, 0x010101, 0x060607, 0x0F0F11, 0x1C1D20, 0x2D2F32,
0x404249, 0x565861, 0x63666D, 0x737582, 0x828591, 0x9197A5, 0xA5A8B5, 0xB5BCCC,
0xCCD3E2, 0xDEE6FB, 0xF7FBFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
0xFFFFFF, 0xF3FBFF, 0xDAE2F7, 0xC8CCDE, 0xB2B9C8, 0x9EA5B2, 0x8E919E, 0x7C7F8B,
0x6B7079, 0x5E6168, 0x4D4F56, 0x393B40, 0x29292F, 0x1C1C1E, 0x111112, 0x080808,
0x020202, 0x000000, 0x000001, 0x010108, 0x030312, 0x050620, 0x080934, 0x0B0E4B,
0x11136B, 0x15188B, 0x1C20B2, 0x2127DA, 0x2930FF, 0x343BFF, 0x3B46FF, 0x4651FF,
0x515EFF, 0x616DFF, 0x6B7CFF, 0x798BFF, 0x889EFF, 0x8294FF, 0x7082FF, 0x6373FF,
0x5663FF, 0x4B54FF, 0x3D49FF, 0x343BFF, 0x2930FF, 0x2126DA, 0x1A1EA8, 0x13167C,
0x0E1056, 0x090A39, 0x050621, 0x020311, 0x010104, 0x000000, 0x010100, 0x080601,
0x130F02, 0x241C05, 0x382D08, 0x51400B, 0x705810, 0x947514, 0xBC941A, 0xEBB920,
0xFFE227, 0xFFFF2F, 0xFFFF38, 0xFFFF42, 0xFFFF4B, 0xFFFF54, 0xFFFF61, 0xFFFF6D,
0xFFFF79, 0xFFFF6D, 0xFFFF61, 0xFFFF54, 0xFFFF49, 0xFFFF40, 0xFFFF36, 0xFFFF2D,
0xFFD724, 0xDAAF1E, 0xAB8817, 0x826612, 0x5E4B0C, 0x3D3008, 0x261E05, 0x141002,
0x080601, 0x010100, 0x000100, 0x010600, 0x031000, 0x071E00, 0x0B3601, 0x114F01,
0x176D01, 0x1E9101, 0x27B902, 0x32EB02, 0x3DFF03, 0x4BFF04, 0x5CFF04, 0x6BFF06,
0x7FFF06, 0x91FF07, 0xA5FF08, 0xBCFF09, 0xD3FF0B, 0xCFFF0A, 0xB9FF09, 0xA5FF08,
0x91FF07, 0x7FFF06, 0x6DFF06, 0x5EFF04, 0x4FFF04, 0x40FF03, 0x34F702, 0x2BC802,
0x219E02, 0x1A7901, 0x125401, 0x0C3901, 0x082400, 0x041400, 0x020800, 0x000100,
0x000000, 0x000106, 0x000313, 0x000829, 0x000E46, 0x00146B, 0x001C94, 0x0026C8,
0x0030FF, 0x003DFF, 0x004BFF, 0x0058FF, 0x006BFF, 0x007FFF, 0x0091FF, 0x00A5FF,
0x00B9FF, 0x00C5FF, 0x00AFFF, 0x0097FF, 0x0082FF, 0x006DFF, 0x005CFF, 0x004BFF,
0x003BFF, 0x0030FF, 0x0024C1, 0x001888, 0x00115C, 0x000B38, 0x00061D, 0x00020A,
0x000001, 0x010000, 0x080200, 0x160700, 0x2F0F01, 0x4D1701, 0x702301, 0x9E3002,
0xCF4003, 0xFF5103, 0xFF6604, 0xFF7C06, 0xFF9406, 0xFFB208, 0xFFCF09, 0xFFEF0A,
0xFFFF0B, 0xFFFF0E, 0xFFFF0C, 0xFFFF0B, 0xFFEB0A, 0xFFD309, 0xFFB908, 0xFFA207,
0xFF8E06, 0xFF7905, 0xFF6804, 0xFF5604, 0xEB4903, 0xBC3902, 0x972F02, 0x732301,
0x511801, 0x381201, 0x240B00, 0x140600, 0x080200, 0x010000, 0x000000, 0x060101,
0x140504, 0x2D0B09, 0x4B1410, 0x701E17, 0x9E2B20, 0xD7392B, 0xFF4B39, 0xFF5E49,
0xFF7358, 0xFF8B6B, 0xFFA57F, 0xFFC597, 0xFFE2AF, 0xFFFFC8, 0xFFFFCC, 0xFFE2AF,
0xFFC194, 0xFFA57C, 0xFF8868, 0xFF6D54, 0xFF5642, 0xFB4232, 0xB93226, 0x82231A,
0x541612, 0x2F0C09, 0x150604, 0x060201, 0x000000, 0x020103, 0x08020B, 0x120518,
0x20092B, 0x300F44, 0x491563, 0x631D88, 0x8226AF, 0xA22FDE, 0xC839FF, 0xF746FF,
0xFF54FF, 0xFF63FF, 0xFF73FF, 0xFF85FF, 0xFF97FF, 0xFFABFF, 0xFFC1FF, 0xFFD3FF,
0xFFDEFF, 0xFFC8FF, 0xFFB5FF, 0xFFA2FF, 0xFF8EFF, 0xFF79FF, 0xFF6BFF, 0xFF5CFF,
0xFF4DFF, 0xD73DFF, 0xAF32F3, 0x8B29C1, 0x6B2094, 0x4F176D, 0x36104B, 0x230A30,
0x14061C, 0x09020C, 0x020103, 0x000000, 0x020100, 0x080400, 0x130800, 0x241100,
0x381800, 0x4F2300, 0x6B3000, 0x8B3D00, 0xB55100, 0xDE6300, 0xFF7900, 0xFF8E00,
0xFFA500, 0xFFC500, 0xFFDE00, 0xFFFF00, 0xFFFF00, 0xFFFF01, 0xFFFF01, 0xFFFF01,
0xFFFF01, 0xFFFF01, 0xFFFF01, 0xFFFF01, 0xFFFF01, 0xFFFF00, 0xFFFF00, 0xFFD700,
0xFFB500, 0xFF9700, 0xFF7C00, 0xDA6300, 0xAB4D00, 0x7F3900, 0x5C2900, 0x3D1C00,
0x231000, 0x120800, 0x060200, 0x000000, 0x010000, 0x050000, 0x0C0000, 0x170000,
0x260000, 0x390000, 0x4F0000, 0x630000, 0x730000, 0x850000, 0x9B0000, 0xAF0000,
0xC50000, 0xDA0000, 0xF70101, 0xFF0101, 0xFF0101, 0xFF0101, 0xFF0101, 0xFF0101,
0xFF0101, 0xF70101, 0xDA0000, 0xC50000, 0xA80000, 0x910000, 0x7C0000, 0x680000,
0x560000, 0x440000, 0x340000, 0x270000, 0x1C0000, 0x120000, 0x0A0000, 0x040000,
0x010000,
};

unsigned pal_8[] =
{
0x000000, 0x288834, 0x1C6814, 0x205820, 0x244820, 0x304024, 0x3C3828, 0x4C342C,
0x583028, 0x682C28, 0x3C2828, 0x842828, 0x0C2828, 0x8C2828, 0x182828, 0x182828,
0xA42828, 0x782828, 0x442828, 0x502828, 0x582828, 0x682828, 0x782828, 0x8C2828,
0x942828, 0x9C2828, 0xA42828, 0xB02828, 0xB82828, 0xC42828, 0xD42828, 0xE02828,
0xE02828, 0xE02C28, 0xE02C2C, 0xE0302C, 0xE0302C, 0xE03430, 0xE43830, 0xE43830,
0xE43C34, 0xE43C34, 0xE44034, 0xE44038, 0xE44438, 0xE8483C, 0xE8483C, 0xE84C3C,
0xE84C40, 0xE85040, 0xE85040, 0xE85444, 0xE85444, 0xEC5844, 0xEC5C48, 0xEC5C48,
0xEC6048, 0xEC604C, 0xEC644C, 0xF06850, 0xF07054, 0xF07458, 0xF07C58, 0xF0805C,
0xF08860, 0xF08C64, 0xF09068, 0xEC986C, 0xEC9C70, 0xECA470, 0xECA874, 0xECAC78,
0xECB47C, 0xECB880, 0xECC084, 0xECC488, 0xECCC8C, 0xE8C88C, 0xE0C488, 0xDCC088,
0xD8BC84, 0xD0B480, 0xCCB07C, 0xC8AC7C, 0xC0A878, 0xBCA478, 0xB8A074, 0xB09C70,
0xAC9470, 0xA8906C, 0xA08C6C, 0x9C8868, 0x988464, 0x908064, 0x8C7C60, 0x887860,
0x80705C, 0x7C6C58, 0x746858, 0x706454, 0x6C6054, 0x645C50, 0x605850, 0x5C544C,
0x544C48, 0x504848, 0x4C4444, 0x484044, 0x403C40, 0x3C383C, 0x38343C, 0x303038,
0x2C2838, 0x282434, 0x202030, 0x1C1C30, 0x18182C, 0x10142C, 0x0C1028, 0x080C28,
0x040828, 0x040828, 0x040828, 0x080C28, 0x0C1028, 0x101428, 0x101828, 0x141C28,
0x182028, 0x1C2428, 0x202828, 0x242C28, 0x243028, 0x283428, 0x2C3828, 0x202C20,
0x182018, 0x0C0C08, 0x100C08, 0x180C08, 0x201008, 0x281008, 0x301008, 0x381408,
0x3C1408, 0x441408, 0x4C1408, 0x541808, 0x5C1808, 0x641808, 0x6C1C08, 0x701C08,
0x782008, 0x802008, 0x882008, 0x902408, 0x982408, 0xA02408, 0xA42808, 0xAC2808,
0xB42808, 0xBC2C08, 0xC42C08, 0xCC2C08, 0xD43008, 0xD83008, 0xDC3004, 0xE42C04,
0xE82C00, 0xEC2C00, 0xF42C00, 0xF43004, 0xF43408, 0xF43808, 0xF43C0C, 0xF44410,
0xF44814, 0xF44C14, 0xF45018, 0xF4541C, 0xF45C1C, 0xF46020, 0xF46424, 0xF46828,
0xF46C28, 0xF4742C, 0xF47830, 0xF47C34, 0xF48034, 0xF48438, 0xF48C3C, 0xF4903C,
0xF49440, 0xF49844, 0xF49C48, 0xF4A448, 0xF4A84C, 0xF4AC50, 0xF4B050, 0xF4B454,
0xF4BC58, 0xF4C05C, 0xF4C45C, 0xF4C860, 0xF4CC64, 0xF8D468, 0xF8CC58, 0xF8CC50,
0xF8C444, 0xF8C43C, 0xF8C434, 0xF8C028, 0xF8C018, 0xF8B810, 0xF8B80C, 0xF8B408,
0xF8B404, 0xF8B004, 0xF8B008, 0xF8A80C, 0xF8A810, 0xF8A418, 0xF8A440, 0xEC9C3C,
0xE4983C, 0xDC943C, 0xD48C3C, 0xCC883C, 0xC48038, 0xBC7C38, 0xB47838, 0xAC7438,
0xA47038, 0x9C6C38, 0x946838, 0x8C6438, 0x886034, 0x805834, 0x785434, 0x705038,
0x684C38, 0x64483C, 0x5C443C, 0x54403C, 0x4C3C40, 0x483840, 0x403444, 0x383044,
0x302C44, 0x2C2848, 0x242448, 0x1C204C, 0x141C4C, 0x101850, 0x141C54, 0x1C1C28,
};

unsigned pal_9[] =
{
0x000000, 0x040404, 0x0C0C0C, 0x101414, 0x181C1C, 0x1C2824, 0x243028, 0x283830,
0x304038, 0x34483C, 0x3C5044, 0x445848, 0x4C6050, 0x506854, 0x58705C, 0x607860,
0x688068, 0x70886C, 0x789070, 0x809878, 0x88A07C, 0x90A880, 0x9CB084, 0xA4B88C,
0xACC090, 0xB4C894, 0xC0CC9C, 0xC8D4A0, 0xD4D8A8, 0xDCE0AC, 0xE4E4B4, 0xF0ECB8,
0xF4ECD0, 0xECE4CC, 0xE4DCC4, 0xE0D4BC, 0xD8C8B8, 0xD0C0B0, 0xC8B8AC, 0xC0B0A4,
0xB8A8A0, 0xB0A098, 0xA89890, 0xA0908C, 0x988884, 0x908080, 0x887878, 0x807070,
0x78686C, 0x706064, 0x68585C, 0x605058, 0x584850, 0x504448, 0x483C44, 0x40343C,
0x342C34, 0x2C282C, 0x242024, 0x1C181C, 0x141414, 0x0C0C0C, 0x040404, 0x000000,
0x000000, 0x040408, 0x0C0C10, 0x141018, 0x1C1820, 0x201C28, 0x282430, 0x2C2C38,
0x343040, 0x3C3848, 0x404050, 0x484858, 0x4C4C60, 0x505468, 0x585C70, 0x5C6478,
0x646C80, 0x687488, 0x6C8090, 0x748898, 0x7890A0, 0x7C98A8, 0x84A0AC, 0x88ACB4,
0x90B4B8, 0x94BCC0, 0x9CC8C8, 0xA0D0CC, 0xA8DCD0, 0xACE4D8, 0xB4ECDC, 0xBCF8E0,
0xD4F8E8, 0xCCF0E0, 0xC8E8D8, 0xC0E0CC, 0xBCD8C4, 0xB4D0BC, 0xACC8B4, 0xA8C0AC,
0xA0B8A4, 0x9CB09C, 0x94A894, 0x90A08C, 0x889884, 0x84907C, 0x7C8874, 0x74806C,
0x707864, 0x687060, 0x606858, 0x586050, 0x545448, 0x4C4C44, 0x44443C, 0x3C3C34,
0x34342C, 0x2C2C28, 0x242420, 0x1C1C18, 0x141414, 0x100C0C, 0x080404, 0x000000,
0x000000, 0x080404, 0x100C0C, 0x181410, 0x201818, 0x282020, 0x302424, 0x382C2C,
0x403034, 0x48383C, 0x503C44, 0x584448, 0x604850, 0x685058, 0x705460, 0x78586C,
0x806074, 0x84647C, 0x8C6C84, 0x94708C, 0x9C7898, 0xA07CA0, 0xA884A8, 0xAC88B0,
0xB490BC, 0xB894C4, 0xC09CCC, 0xC4A4D8, 0xC8A8E0, 0xCCB0E8, 0xD4B8F0, 0xD8C0F8,
0xE0D8F8, 0xD8D0F0, 0xD0CCE8, 0xC8C4E0, 0xC0C0D8, 0xB8B8D0, 0xB0B4C8, 0xA8ACC0,
0xA0A4B8, 0x98A0B0, 0x9098A8, 0x8894A0, 0x808C98, 0x788490, 0x748088, 0x6C787C,
0x647074, 0x5C6C6C, 0x586464, 0x505C5C, 0x485454, 0x444C4C, 0x3C4444, 0x343C3C,
0x2C3434, 0x28302C, 0x202824, 0x18201C, 0x141814, 0x0C100C, 0x040804, 0x000000,
0x000000, 0x040804, 0x0C100C, 0x101810, 0x182018, 0x202820, 0x283024, 0x30382C,
0x344030, 0x3C4834, 0x44503C, 0x4C5840, 0x546048, 0x5C644C, 0x686C54, 0x707458,
0x787C60, 0x808064, 0x88886C, 0x949070, 0x9C9478, 0xA49C7C, 0xACA084, 0xB8A488,
0xC0AC90, 0xC8B098, 0xD0B4A0, 0xD8BCA8, 0xE0C0B0, 0xE8C4B8, 0xF0C8C0, 0xF8CCC8,
0xF8DCDC, 0xF0D4D4, 0xE8CCD0, 0xE0C4C8, 0xD8BCC4, 0xD0B4BC, 0xC8ACB8, 0xC0A4B0,
0xB89CAC, 0xB094A4, 0xA88C9C, 0x9C8898, 0x948090, 0x8C7888, 0x847084, 0x7C6C7C,
0x746474, 0x6C5C6C, 0x645864, 0x5C505C, 0x504858, 0x484450, 0x403C48, 0x383440,
0x343038, 0x2C2830, 0x242028, 0x1C1C20, 0x141418, 0x0C0C10, 0x040408, 0x000000,
};

unsigned pal_10[] =
{
0x000000, 0x040000, 0x0C0000, 0x140000, 0x1C0000, 0x240000, 0x2C0000, 0x340000,
0x3C0000, 0x440000, 0x4C0000, 0x540000, 0x5C0000, 0x640000, 0x6C0000, 0x740000,
0x7C0000, 0x840000, 0x8C0000, 0x940000, 0x9C0000, 0xA40000, 0xAC0000, 0xB40000,
0xBC0000, 0xC40000, 0xCC0000, 0xD40000, 0xDC0000, 0xE40000, 0xEC0000, 0xF40000,
0xFC0000, 0xFC0404, 0xFC0C0C, 0xFC1414, 0xFC1C1C, 0xFC2424, 0xFC2C2C, 0xFC3434,
0xFC3C3C, 0xFC4444, 0xFC4C4C, 0xFC5454, 0xFC5C5C, 0xFC6464, 0xFC6C6C, 0xFC7474,
0xFC7C7C, 0xFC8484, 0xFC8C8C, 0xFC9494, 0xFC9C9C, 0xFCA4A4, 0xFCACAC, 0xFCB4B4,
0xFCBCBC, 0xFCC4C4, 0xFCCCCC, 0xFCD4D4, 0xFCDCDC, 0xFCE4E4, 0xFCECEC, 0xFCF4F4,
0xFCFCFC, 0xFCF8F4, 0xFCF8EC, 0xFCF4E4, 0xFCF4DC, 0xFCF0D4, 0xFCF0CC, 0xFCECC4,
0xFCECBC, 0xFCE8B4, 0xFCE8AC, 0xFCE4A4, 0xFCE49C, 0xFCE094, 0xFCE08C, 0xFCDC84,
0xFCDC7C, 0xFCDC74, 0xFCD86C, 0xFCD864, 0xFCD45C, 0xFCD454, 0xFCD04C, 0xFCD044,
0xFCCC3C, 0xFCCC34, 0xFCC82C, 0xFCC824, 0xFCC41C, 0xFCC414, 0xFCC00C, 0xFCC004,
0xFCC000, 0xF4B800, 0xECB400, 0xE4AC00, 0xDCA800, 0xD4A000, 0xCC9C00, 0xC49400,
0xBC9000, 0xB48800, 0xAC8400, 0xA47C00, 0x9C7800, 0x947000, 0x8C6C00, 0x846400,
0x7C6000, 0x745800, 0x6C5400, 0x644C00, 0x5C4800, 0x544000, 0x4C3C00, 0x443400,
0x3C3000, 0x342800, 0x2C2400, 0x241C00, 0x1C1800, 0x141000, 0x0C0C00, 0x040400,
0x000000, 0x040400, 0x0C0800, 0x140C00, 0x1C1000, 0x241400, 0x2C1800, 0x341C00,
0x3C2000, 0x442400, 0x4C2800, 0x542C00, 0x5C3000, 0x643400, 0x6C3800, 0x743C00,
0x7C4000, 0x844400, 0x8C4800, 0x944C00, 0x9C5000, 0xA45400, 0xAC5800, 0xB45C00,
0xBC6000, 0xC46400, 0xCC6800, 0xD46C00, 0xDC7000, 0xE47400, 0xEC7800, 0xF47C00,
0xFC8000, 0xFC8004, 0xFC840C, 0xFC8814, 0xFC8C1C, 0xFC9024, 0xFC942C, 0xFC9834,
0xFC9C3C, 0xFCA044, 0xFCA44C, 0xFCA854, 0xFCAC5C, 0xFCB064, 0xFCB46C, 0xFCB874,
0xFCBC7C, 0xFCC084, 0xFCC48C, 0xFCC894, 0xFCCC9C, 0xFCD0A4, 0xFCD4AC, 0xFCD8B4,
0xFCDCBC, 0xFCE0C4, 0xFCE4CC, 0xFCE8D4, 0xFCECDC, 0xFCF0E4, 0xFCF4EC, 0xFCF8F4,
0xFCFCFC, 0xFCF8F4, 0xFCF8EC, 0xFCF4E4, 0xFCF4DC, 0xFCF0D4, 0xFCF0CC, 0xFCECC4,
0xFCECBC, 0xFCE8B4, 0xFCE8AC, 0xFCE4A4, 0xFCE49C, 0xFCE094, 0xFCE08C, 0xFCDC84,
0xFCDC7C, 0xFCDC74, 0xFCD86C, 0xFCD864, 0xFCD45C, 0xFCD454, 0xFCD04C, 0xFCD044,
0xFCCC3C, 0xFCCC34, 0xFCC82C, 0xFCC824, 0xFCC41C, 0xFCC414, 0xFCC00C, 0xFCC004,
0xFCC000, 0xF4B800, 0xECB400, 0xE4AC00, 0xDCA800, 0xD4A000, 0xCC9C00, 0xC49400,
0xBC9000, 0xB48800, 0xAC8400, 0xA47C00, 0x9C7800, 0x947000, 0x8C6C00, 0x846400,
0x7C6000, 0x745800, 0x6C5400, 0x644C00, 0x5C4800, 0x544000, 0x4C3C00, 0x443400,
0x3C3000, 0x342800, 0x2C2400, 0x241C00, 0x1C1800, 0x141000, 0x0C0C00, 0x040400,
};

unsigned pal_11[] =
{
0x000000, 0x020201, 0x0F0E0C, 0x1D1C19, 0x2D2B27, 0x393833, 0x46443D, 0x514E47,
0x5B5850, 0x646057, 0x676358, 0x6A6658, 0x6C6758, 0x6E6957, 0x706A57, 0x736C56,
0x766E55, 0x7B7257, 0x847B5F, 0x8C8466, 0x958C70, 0x9E9578, 0xA69D80, 0xAEA588,
0xB5AB8F, 0xBAB194, 0xBCB393, 0xBEB393, 0xC0B593, 0xC2B791, 0xC4B790, 0xC6B990,
0xC9BB90, 0xCDBE91, 0xD2C597, 0xD7C99C, 0xDCCEA2, 0xE1D3A7, 0xE5D8AD, 0xE9DCB2,
0xEDDFB6, 0xEFE2B9, 0xEDE0B6, 0xE9DBB1, 0xE5D7AC, 0xE1D3A7, 0xDDCEA1, 0xD7C99C,
0xD2C496, 0xCCBF91, 0xC9BD91, 0xC7BB91, 0xC3B891, 0xC1B692, 0xBFB693, 0xBDB494,
0xBBB394, 0xB7B093, 0xB1AA8E, 0xAAA386, 0xA19C7E, 0x9A9377, 0x908A6D, 0x878164,
0x7E795D, 0x767257, 0x716D54, 0x6D6A53, 0x6A6854, 0x686654, 0x666655, 0x646456,
0x636357, 0x5F6056, 0x56574D, 0x4A4C45, 0x3E3F39, 0x31332E, 0x252722, 0x191A17,
0x0D0E0C, 0x030403, 0x040101, 0x0F0707, 0x190E0D, 0x231212, 0x2D1918, 0x371F1E,
0x402424, 0x492828, 0x4D2726, 0x502523, 0x542220, 0x571F1C, 0x5C1D19, 0x611B17,
0x671A16, 0x6D1B15, 0x751E19, 0x7D251F, 0x842A24, 0x8D312A, 0x953730, 0x9A3C35,
0xA1413A, 0xA7433C, 0xAA433B, 0xAD4139, 0xB03E36, 0xB33B33, 0xB6392F, 0xB9362D,
0xBD342A, 0xC13329, 0xC6382D, 0xCB3D32, 0xCF4237, 0xD3473B, 0xD94B41, 0xDB4F45,
0xDF5449, 0xE2574B, 0xE05349, 0xDD4F44, 0xD94B40, 0xD6463B, 0xD14136, 0xCC3C31,
0xC7382C, 0xC33429, 0xBF362B, 0xBC382F, 0xB83A31, 0xB53C34, 0xB33F37, 0xAF4139,
0xAC433B, 0xA8433C, 0xA34038, 0x9C3A33, 0x95362E, 0x8E2E28, 0x872923, 0x7E241D,
0x761E17, 0x701A13, 0x6A1B14, 0x651C17, 0x601F19, 0x5C211D, 0x57231F, 0x542623,
0x512825, 0x4C2826, 0x432421, 0x381E1C, 0x2F1917, 0x261313, 0x1C0E0E, 0x110909,
0x080303, 0x020101, 0x090A0A, 0x151717, 0x232626, 0x313434, 0x3E4142, 0x4B4E4E,
0x575A5A, 0x606464, 0x626666, 0x646969, 0x656969, 0x686D6D, 0x6B7070, 0x6F7474,
0x747979, 0x7B8080, 0x868A8B, 0x8F9393, 0x999C9C, 0xA2A5A5, 0xABADAD, 0xB2B5B5,
0xBABCBC, 0xBFC1C1, 0xC2C4C4, 0xC5C7C7, 0xC8CACA, 0xCACCCC, 0xCECFD0, 0xD1D2D2,
0xD5D7D7, 0xD9DADB, 0xDFE0E0, 0xE4E4E4, 0xE9EAEA, 0xEEEEEE, 0xF2F2F2, 0xF6F6F6,
0xF9F9F9, 0xFCFCFC, 0xFBFBFB, 0xF8F8F8, 0xF5F5F5, 0xF2F1F1, 0xEDEDED, 0xE8E8E8,
0xE3E3E3, 0xDEDEDE, 0xDBDADA, 0xD6D6D6, 0xD3D3D3, 0xD0D0D0, 0xCECECE, 0xCACACA,
0xC8C7C7, 0xC4C4C3, 0xBEBEBE, 0xB7B7B7, 0xAFAFAF, 0xA7A7A7, 0x9E9D9D, 0x969595,
0x8D8C8C, 0x848383, 0x7F7F7E, 0x7A7A79, 0x767575, 0x737271, 0x71706F, 0x6E6D6D,
0x6B6B6B, 0x686767, 0x5D5C5C, 0x505050, 0x434242, 0x363535, 0x282727, 0x191919,
0x0D0D0D, 0x030303, 0x070707, 0x101112, 0x191C1C, 0x242627, 0x2F3232, 0x3A3E3E,
0x434848, 0x4A4F50, 0x484E50, 0x464C4E, 0x434A4D, 0x41494C, 0x3E484B, 0x3C474B,
0x3B484C, 0x3F4D51, 0x48565A, 0x505F62, 0x59686C, 0x627175, 0x6B7A7E, 0x728286,
0x7A898D, 0x7F8E92, 0x7E8E92, 0x7D8E92, 0x7B8D91, 0x798C91, 0x778B91, 0x758A91,
0x748B92, 0x748C94, 0x7A9299, 0x82989F, 0x889FA5, 0x8FA5AB, 0x94AAB1, 0x9AAFB6,
0x9FB3BA, 0xA2B7BD, 0x9FB5BB, 0x9AB1B7, 0x96ACB2, 0x8FA6AC, 0x89A0A8, 0x839BA2,
0x7E969E, 0x799198, 0x789097, 0x7A9096, 0x7B9097, 0x7D9197, 0x7F9297, 0x819297,
0x829297, 0x839397, 0x7F8E92, 0x76868A, 0x6F7E82, 0x667579, 0x5D6C72, 0x556368,
0x4C5B60, 0x475559, 0x465357, 0x465256, 0x475255, 0x495256, 0x4C5457, 0x4E5558,
0x505658, 0x4F5557, 0x474C4D, 0x3D4143, 0x333637, 0x292B2C, 0x1C1E1F, 0x121314,
0x080A0A, 0x020203, 0x070707, 0x121312, 0x1E1F1E, 0x2A2B2A, 0x373837, 0x434543,
0x4D504E, 0x555856, 0x555856, 0x555A56, 0x555A57, 0x555A57, 0x565B58, 0x555C58,
0x58605C, 0x5D6561, 0x68706B, 0x717974, 0x7A827D, 0x838C86, 0x8B948F, 0x939C97,
0x9AA39F, 0xA0A9A4, 0xA1ABA6, 0xA1ACA6, 0xA1ADA7, 0xA1AFA8, 0xA1AFA9, 0xA3B1AB,
0xA4B4AC, 0xA7B7AF, 0xADBDB5, 0xB3C3BB, 0xB9C8C1, 0xBECDC5, 0xC3D2CB, 0xC7D6CF,
0xCBDAD3, 0xCEDCD6, 0xCFDCD6, 0xCBDAD3, 0xC6D6CE, 0xC1D0C9, 0xBDCDC5, 0xB8C8C1,
0xB2C3BB, 0xAEBEB6, 0xACBCB4, 0xABBAB2, 0xAAB9B1, 0xA9B7B0, 0xA9B6B0, 0xA9B5AF,
0xA8B4AF, 0xA6B1AC, 0xA1ABA7, 0x9AA49F, 0x929C97, 0x8A9590, 0x838D87, 0x7A837F,
0x717B76, 0x6B746F, 0x6A736E, 0x67706B, 0x656C68, 0x646B68, 0x646A67, 0x646967,
0x646866, 0x616562, 0x585B59, 0x4D504E, 0x424442, 0x343735, 0x272928, 0x1B1C1B,
0x0F1010,
};

SDL_Surface *screen;
long double X1 = -2;
long double X2 = 2;
long double Y1 = -2;
long double Y2 = 2;

double image_w;
double image_h;/*Taille de l'image*/

long double pas_x;
long double pas_y;/*Le pas a utilisé dans le remplissage du plan complexe*/

unsigned MAX = 30;
long double ZOOM = 250;

typedef struct
{
    long double e;
    long double i;
    long double j;
    long double k;
}complex;

typedef struct {

unsigned *pal;
unsigned taille;
}palettes;

typedef struct
{
    bool key[SDLK_LAST];
    bool done;
}Event;

palettes actu = {pal_0, sizeof(pal_0) / sizeof(unsigned)};

void updateEvent(Event*);
void instancieEvent(Event*);/*Gère les events*/
void drawMandelbrot(void);
unsigned nb_thread = 8;

#define addition_quaternion(z, z1) {z.e += z1.e;\
                                   z.i += z1.i;\
                                   z.j += z1.j;\
                                   z.k += z1.k;}

#define module_quaternion(z)       ((z.e * z.e) + (z.i * z.i) + (z.j * z.j) + (z.k * z.k))

#define multiplication_quaternion(z, z1) {complex tmp = z, tmp2 = z1;\
                                         z.e = ((tmp.e * tmp2.e) - (tmp.i * tmp2.i) - (tmp.j * tmp2.j) - (tmp.k * tmp2.j));\
                                         z.i = ((tmp.e * tmp2.i) + (tmp.i * tmp2.e) + (tmp.j * tmp2.k) - (tmp.k * tmp2.j));\
                                         z.j = ((tmp.e * tmp2.j) + (tmp.j * tmp2.e) - (tmp.i * tmp2.k) + (tmp.k * tmp2.i));\
                                         z.k = ((tmp.k * tmp2.e) + (tmp.e * tmp2.k) + (tmp.i * tmp2.j) - (tmp.j * tmp.i));}

#define init_quaternion(z, E, I, J, K) z.e = (E);\
                                       z.i = (I);\
                                       z.j = (J);\
                                       z.k = (K)

#define egale_quaternion(z, z1) z.e = z1.e;\
                                z.i = z1.i;\
                                z.j = z1.j;\
                                z.k = z1.k

int thread_1_Mandelbrot(void *unused);
int thread_2_Mandelbrot(void *unused);
int thread_3_Mandelbrot(void *unused);
int thread_4_Mandelbrot(void *unused);
int thread_5_Mandelbrot(void *unused);
int thread_6_Mandelbrot(void *unused);
int thread_7_Mandelbrot(void *unused);
int thread_8_Mandelbrot(void *unused);/*Les 8 threads*/

int thread_1_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;/*Les nombres complexes*/
    Uint32 *offset;/*Pour le calcul d'adresse*/
    unsigned i;/*Pour la couleur*/

    for(yS = 0, y = Y1; yS < (image_h / nb_thread); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);/*On récupère l'adresse du premier pixel de la ligne Ys, (Merci a Gurney pour cette technique)*/
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);/*On multiplie les quaternions entre eux*/
                addition_quaternion(z, c);/*On les additionnes*/
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + (i * actu.taille / MAX));/*On colorie le pixel*/
        }
    }

    unused = NULL;

    return 0;
}

int thread_2_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;
    Uint32 *offset;
    unsigned i;

    for(yS = ((unsigned)image_h / nb_thread),y = (image_h / nb_thread) * pas_y + Y1; yS < 2 * (image_h / nb_thread); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + (i * actu.taille / MAX));
        }
    }

    unused = NULL;

    return 0;
}

int thread_3_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;
    Uint32 *offset;
    unsigned i;

    for(yS = 2 * ((unsigned)image_h / nb_thread),y = 2 * ((image_h / nb_thread) * pas_y) + Y1; yS < 3 * (image_h / nb_thread); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS)  = *(actu.pal + (i * actu.taille / MAX));
        }
    }

    unused = NULL;

    return 0;
}

int thread_4_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;
    Uint32 *offset;
    unsigned i;

    for(yS = 3 * ((unsigned)image_h / nb_thread),y = 3 * ((image_h / nb_thread) * pas_y) + Y1; yS < 4 * (image_h / nb_thread); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + (i * actu.taille / MAX));
        }
    }

    unused = NULL;

    return 0;
}

int thread_5_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;
    Uint32 *offset;
    unsigned i;

    for(yS = 4 * ((unsigned)image_h / nb_thread),y = 4 * ((image_h / nb_thread) * pas_y) + Y1; yS < 5 * (image_h / nb_thread); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + (i * actu.taille / MAX));
        }
    }

    unused = NULL;

    return 0;
}

int thread_6_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;
    Uint32 *offset;
    unsigned i;

    for(yS = 5 * ((unsigned)image_h / nb_thread),y = 5 * ((image_h / nb_thread) * pas_y) + Y1; yS < 6 * (image_h / nb_thread); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + (i * actu.taille / MAX));
        }
    }

    unused = NULL;

    return 0;
}

int thread_7_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;
    Uint32 *offset;
    unsigned i;

    for(yS = 6 * ((unsigned)image_h / nb_thread),y = 6 * ((image_h / nb_thread) * pas_y) + Y1; yS < 7 * (image_h / nb_thread); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + (i * actu.taille / MAX));
        }
    }

    unused = NULL;

    return 0;
}

int thread_8_Mandelbrot(void *unused)
{
    long double x, y;/*Plan complexe*/
    unsigned xS, yS;/*Plan normal*/
    complex z, c;
    Uint32 *offset;
    unsigned i;

    for(yS = 7 * ((unsigned)image_h / nb_thread),y = 7 * ((image_h / nb_thread) * pas_y) + Y1; yS < image_h; ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < image_w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);

            do
            {
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + (i * actu.taille / MAX));
        }
    }

    unused = NULL;

    return 0;
}

void drawMandelbrot(void)
{
    SDL_Thread *t1, *t2, *t3, *t4, *t5, *t6, *t7, *t8;
    SDL_FillRect(screen, NULL, 0);

    t1 = SDL_CreateThread(thread_1_Mandelbrot, NULL);
    t2 = SDL_CreateThread(thread_2_Mandelbrot, NULL);
    t3 = SDL_CreateThread(thread_3_Mandelbrot, NULL);
    t4 = SDL_CreateThread(thread_4_Mandelbrot, NULL);
    t5 = SDL_CreateThread(thread_5_Mandelbrot, NULL);
    t6 = SDL_CreateThread(thread_6_Mandelbrot, NULL);
    t7 = SDL_CreateThread(thread_7_Mandelbrot, NULL);
    t8 = SDL_CreateThread(thread_8_Mandelbrot, NULL);/*On lance les threads*/

    SDL_WaitThread(t1, NULL);
    SDL_WaitThread(t2, NULL);
    SDL_WaitThread(t3, NULL);
    SDL_WaitThread(t4, NULL);
    SDL_WaitThread(t5, NULL);
    SDL_WaitThread(t6, NULL);
    SDL_WaitThread(t7, NULL);
    SDL_WaitThread(t8, NULL);/*On attend la fin des threads*/

    SDL_UpdateRect(screen, 0, 0, 0, 0);
}

void instancieEvent(Event* in)
{
    int i;

    for(i = 0; i < SDLK_LAST; i++)
    {
        in->key[i] = false;
    }
    in->done = false;
}


void updateEvent(Event *in)/*Fonction gérant les évents*/
{
    SDL_Event event;

    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_KEYDOWN:
                in->key[event.key.keysym.sym] = true;/*Si on appuie on met la touche a un*/
            break;

            case SDL_KEYUP:
                in->key[event.key.keysym.sym] = false;/*Si on la relache, on la met a 0*/
            break;

            case SDL_QUIT:
                in->done = true;/*Si on appuie sur la touche quiter, on met done a 1*/
            break;

            default:break;
        }
    }
}

int main(void)
{
    long double ctrX, ctrY;
    Event in;

    image_w = (double)((X2 - X1) * ZOOM);
    image_h = (double)((Y2 - Y1) * ZOOM);

    pas_x = (X2 - X1) / image_w;
    pas_y = (Y2 - Y1) / image_h;

    if(SDL_Init(SDL_INIT_VIDEO) == -1)
    {
        fprintf(stderr, "Erreur lors de l'initialisation SDL : %s", SDL_GetError());
        return -1;
    }
    atexit(SDL_Quit);

    screen = SDL_SetVideoMode((int)image_w, (int)image_h, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

    if(!screen)
    {
        fprintf(stderr, "Erreur lors de la creation de l'ecran : %s", SDL_GetError());
        return -1;
    }

    drawMandelbrot();

    instancieEvent(&in);

    while(!in.done)
    {
        updateEvent(&in);
        if (in.key[SDLK_RETURN])
		{
			ctrX = X1 + ((X2 - X1) / 2);
			ctrY = Y1 + ((Y2 - Y1) / 2);

			X1 = ((X1 - ctrX) * 0.5) + ctrX;
			X2 = ((X2 - ctrX) * 0.5) + ctrX;
			Y1 = ((Y1 - ctrY) * 0.5) + ctrY;
			Y2 = ((Y2 - ctrY) * 0.5) + ctrY;

			pas_x = (X2 - X1) / image_w;
			pas_y = (Y2 - Y1) / image_h;
			drawMandelbrot();
			in.key[SDLK_RETURN] = false;
		}

		else if (in.key[SDLK_BACKSPACE])
		{
			ctrX = X1 + ((X2 - X1) / 2);
			ctrY = Y1 + ((Y2 - Y1) / 2);

			X1 = ((X1 - ctrX) * 2) + ctrX;
			X2 = ((X2 - ctrX) * 2) + ctrX;
			Y1 = ((Y1 - ctrY) * 2) + ctrY;
			Y2 = ((Y2 - ctrY) * 2) + ctrY;

			pas_x = (X2 - X1) / image_w;
			pas_y = (Y2 - Y1) / image_h;
			drawMandelbrot();
			in.key[SDLK_BACKSPACE] = false;
		}

		/*On se déplace*/

		else if (in.key[SDLK_UP])
		{
			Y1 -= 50 * pas_y;
			Y2 -= 50 * pas_y;
			drawMandelbrot();
		}

		else if (in.key[SDLK_DOWN])
		{
			Y1 += 50 * pas_y;
			Y2 += 50 * pas_y;
			drawMandelbrot();
		}

		else if (in.key[SDLK_LEFT])
		{
			X1 -= 50 * pas_x;
			X2 -= 50 * pas_x;
            drawMandelbrot();

		}

		else if (in.key[SDLK_RIGHT])
		{
			X1 += 50 * pas_x;
			X2 += 50 * pas_x;
			drawMandelbrot();
		}

		/*On change le nombre d'iteration*/

		else if (in.key[SDLK_KP_PLUS] || in.key[SDLK_PLUS])
		{
			MAX += ITER_STEP;
			in.key[SDLK_KP_PLUS] = false;
            drawMandelbrot();

		}

		else if (in.key[SDLK_KP_MINUS] || in.key[SDLK_MINUS])
		{
			if (MAX > ITER_STEP * 2)
			{
				MAX -= ITER_STEP;
                in.key[SDLK_KP_MINUS] = false;
			}
		}

		else if(in.key[SDLK_F1])
		{
		    actu.pal = pal_0;
		    actu.taille = sizeof(pal_0) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F2])
		{
		    actu.pal = pal_1;
		    actu.taille = sizeof(pal_1) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F3])
		{
		    actu.pal = pal_2;
		    actu.taille = sizeof(pal_2) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F4])
		{
		    actu.pal = pal_3;
		    actu.taille = sizeof(pal_3) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F5])
		{
		    actu.pal = pal_4;
		    actu.taille = sizeof(pal_4) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F6])
		{
		    actu.pal = pal_5;
		    actu.taille = sizeof(pal_5) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F7])
		{
		    actu.pal = pal_6;
		    actu.taille = sizeof(pal_6) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F8])
		{
		    actu.pal = pal_7;
		    actu.taille = sizeof(pal_7) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F9])
		{
		    actu.pal = pal_8;
		    actu.taille = sizeof(pal_8) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F10])
		{
		    actu.pal = pal_9;
		    actu.taille = sizeof(pal_9) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F11])
		{
		    actu.pal = pal_10;
		    actu.taille = sizeof(pal_10) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_F12])
		{
		    actu.pal = pal_11;
		    actu.taille = sizeof(pal_11) / sizeof(unsigned);
		    drawMandelbrot();
		}

		else if(in.key[SDLK_SPACE])/*On enregistre*/
		{
		    SDL_SaveBMP(SDL_GetVideoSurface(), "Mandelbrot.bmp");
		}

		else{}
    }
    return 0;
}


Le code un peu long, mais bon, rien de bien difficile(il est possible de faire beaucoup plus court en enlevant les threads)

Rien de bien compliquer si ce n'est la multiplication des quaternions, m'a fallut utiliser mes neuronnes ^^.( et Wikipedia ).

Cordialement Qnope
  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
1 novembre 2010 à 12:40:00

Citation : qnope

il est possible de faire beaucoup plus court en enlevant les threads


Bah, tes threads font quasiment la même chose, tu pourrais utiliser le préprocesseur pour générer tes fonctions et économiser... beaucoup de lignes. ^^
Tu ferais bien d'utiliser les tableaux pour ta fonction drawMandelbrot. :-°
Pour ta fonction main aussi.
Ton code fait tourner mon proc à 100%, rajoutes une petite gestion des ressources et ce sera pas mal. ;)

Sinon le rendu est sympa. :)
  • Partager sur Facebook
  • Partager sur Twitter
2 novembre 2010 à 16:43:08

Comme demander, j'ai modifier mon code, pour les prochaines images, promis je les mets en PNG.

main.c
#include <SDL.h>
#include <stdio.h>
#include <SDL_thread.h>
#include "Palettes.h"
#define BLANC 0x00ffffff

#define bool char
#define true 1
#define false 0
#define ITER_STEP 20

SDL_Surface *screen;
long double X1 = -2;
long double X2 = 2;
long double Y1 = -2;
long double Y2 = 2;

double image_w;
double image_h;/*Taille de l'image*/

long double pas_x;
long double pas_y;/*Le pas a utilisé dans le remplissage du plan complexe*/

unsigned MAX = 20;
long double ZOOM = 250;

typedef struct
{
    long double e;
    long double i;
    long double j;
    long double k;
}complex;

typedef struct
{
    unsigned *pal;
    unsigned taille;
}palettes;

typedef struct
{
    bool key[SDLK_LAST];
    bool done;
}Event;

void updateEvent(Event*);
void instancieEvent(Event*);/*Gère les events*/
void drawMandelbrot(void);

int indiceTabActu = 0;/*Indice du tableau*/

unsigned *pointeurSurPalettes[] = {pal_0, pal_1, pal_2, pal_3, pal_4, pal_5, pal_6, pal_7, pal_8, pal_9, pal_10, pal_11};

unsigned taillePalettes[] = {sizeof(pal_0) / sizeof(unsigned), sizeof(pal_1) / sizeof(unsigned), sizeof(pal_2) / sizeof(unsigned), sizeof(pal_3) / sizeof(unsigned), sizeof(pal_4) / sizeof(unsigned),
                             sizeof(pal_5) / sizeof(unsigned), sizeof(pal_6) / sizeof(unsigned), sizeof(pal_7) / sizeof(unsigned), sizeof(pal_8) / sizeof(unsigned), sizeof(pal_9) / sizeof(unsigned),
                             sizeof(pal_10) / sizeof(unsigned), sizeof(pal_11) / sizeof(unsigned)};

palettes actu = {pal_0, sizeof(pal_0) / sizeof(unsigned)};


#define nb_thread 8

#define addition_quaternion(z, z1) {z.e += z1.e;\
                                   z.i += z1.i;\
                                   z.j += z1.j;\
                                   z.k += z1.k;}

#define module_quaternion(z)       ((z.e * z.e) + (z.i * z.i) + (z.j * z.j) + (z.k * z.k))

#define multiplication_quaternion(z, z1) {complex tmp = z, tmp2 = z1;\
                                         z.e = ((tmp.e * tmp2.e) - (tmp.i * tmp2.i) - (tmp.j * tmp2.j) - (tmp.k * tmp2.j));\
                                         z.i = ((tmp.e * tmp2.i) + (tmp.i * tmp2.e) + (tmp.j * tmp2.k) - (tmp.k * tmp2.j));\
                                         z.j = ((tmp.e * tmp2.j) + (tmp.j * tmp2.e) - (tmp.i * tmp2.k) + (tmp.k * tmp2.i));\
                                         z.k = ((tmp.k * tmp2.e) + (tmp.e * tmp2.k) + (tmp.i * tmp2.j) - (tmp.j * tmp.i));}

#define init_quaternion(z, E, I, J, K) z.e = (E);\
                                       z.i = (I);\
                                       z.j = (J);\
                                       z.k = (K)

#define egale_quaternion(z, z1) z.e = z1.e;\
                                z.i = z1.i;\
                                z.j = z1.j;\
                                z.k = z1.k

int thread_Mandelbrot(void *indice);

int thread_Mandelbrot(void *indice)
{
    complex z, c;
    long double x, y;
    unsigned xS, yS, i;
    Uint32 *offset;
    int n = *(int*)indice;

    long double entreY = n * image_h / nb_thread * pas_y + Y1;
    long double entreYS = n * image_h / nb_thread;
    long double sortieYS = (n + 1) * image_h / nb_thread;

    for(y = (entreY), yS = (unsigned)(entreYS); yS < (sortieYS); ++yS, y += pas_y)
    {
        offset = (Uint32*)((Uint8*)screen->pixels + yS * screen->pitch);
        for(xS = 0, x = X1; xS < (unsigned)screen->w; ++xS, x += pas_x)
        {
            i = 0;
            init_quaternion(z, x, y, x * x, y * y);
            egale_quaternion(c, z);
            do
            {\
                multiplication_quaternion(z, z);
                addition_quaternion(z, c);
                ++i;
            }while(module_quaternion(z) < 4 && i < MAX);

            *(offset + xS) = *(actu.pal + actu.taille * i / MAX);
        }
    }

    return 0;
}

void drawMandelbrot(void)
{
    SDL_Thread *t[nb_thread];
    int i;
    SDL_FillRect(screen, NULL, 0);

    for(i = 0; i< nb_thread; ++i)t[i] = SDL_CreateThread(thread_Mandelbrot, &i), SDL_Delay(1);

    for(i = 0; i < nb_thread; ++i)SDL_WaitThread(t[i], NULL);

    SDL_UpdateRect(screen, 0, 0, 0, 0);
}

void instancieEvent(Event* in)
{
    int i;

    for(i = 0; i < SDLK_LAST; i++)
    {
        in->key[i] = false;
    }
    in->done = false;
}


void updateEvent(Event *in)/*Fonction gérant les évents*/
{
    SDL_Event event;

    while(SDL_PollEvent(&event))
    {
        switch(event.type)
        {
            case SDL_KEYDOWN:
                in->key[event.key.keysym.sym] = true;/*Si on appuie on met la touche a un*/
            break;

            case SDL_KEYUP:
                in->key[event.key.keysym.sym] = false;/*Si on la relache, on la met a 0*/
            break;

            case SDL_QUIT:
                in->done = true;/*Si on appuie sur la touche quiter, on met done a 1*/
            break;

            default:break;
        }
    }

    SDL_Delay(30);
}

int main(void)
{
    long double ctrX, ctrY;
    Event in;

    image_w = (double)((X2 - X1) * ZOOM);
    image_h = (double)((Y2 - Y1) * ZOOM);

    pas_x = (X2 - X1) / image_w;
    pas_y = (Y2 - Y1) / image_h;

    if(SDL_Init(SDL_INIT_VIDEO) == -1)
    {
        fprintf(stderr, "Erreur lors de l'initialisation SDL : %s", SDL_GetError());
        return -1;
    }
    atexit(SDL_Quit);

    screen = SDL_SetVideoMode((int)image_w, (int)image_h, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

    if(!screen)
    {
        fprintf(stderr, "Erreur lors de la creation de l'ecran : %s", SDL_GetError());
        return -1;
    }

    drawMandelbrot();

    instancieEvent(&in);

    while(!in.done)
    {
        updateEvent(&in);
        if (in.key[SDLK_RETURN])
		{
			ctrX = X1 + ((X2 - X1) / 2);
			ctrY = Y1 + ((Y2 - Y1) / 2);

			X1 = ((X1 - ctrX) * 0.5) + ctrX;
			X2 = ((X2 - ctrX) * 0.5) + ctrX;
			Y1 = ((Y1 - ctrY) * 0.5) + ctrY;
			Y2 = ((Y2 - ctrY) * 0.5) + ctrY;

			pas_x = (X2 - X1) / image_w;
			pas_y = (Y2 - Y1) / image_h;
			drawMandelbrot();
			in.key[SDLK_RETURN] = false;
		}

		else if (in.key[SDLK_BACKSPACE])
		{
			ctrX = X1 + ((X2 - X1) / 2);
			ctrY = Y1 + ((Y2 - Y1) / 2);

			X1 = ((X1 - ctrX) * 2) + ctrX;
			X2 = ((X2 - ctrX) * 2) + ctrX;
			Y1 = ((Y1 - ctrY) * 2) + ctrY;
			Y2 = ((Y2 - ctrY) * 2) + ctrY;

			pas_x = (X2 - X1) / image_w;
			pas_y = (Y2 - Y1) / image_h;
			drawMandelbrot();
			in.key[SDLK_BACKSPACE] = false;
		}

		/*On se déplace*/

		else if (in.key[SDLK_UP])
		{
			Y1 -= 50 * pas_y;
			Y2 -= 50 * pas_y;
			drawMandelbrot();
		}

		else if (in.key[SDLK_DOWN])
		{
			Y1 += 50 * pas_y;
			Y2 += 50 * pas_y;
			drawMandelbrot();
		}

		else if (in.key[SDLK_LEFT])
		{
			X1 -= 50 * pas_x;
			X2 -= 50 * pas_x;
            drawMandelbrot();

		}

		else if (in.key[SDLK_RIGHT])
		{
			X1 += 50 * pas_x;
			X2 += 50 * pas_x;
			drawMandelbrot();
		}

		/*On change le nombre d'iteration*/

		else if (in.key[SDLK_KP_PLUS] || in.key[SDLK_PLUS])
		{
			MAX += ITER_STEP;
			in.key[SDLK_KP_PLUS] = false;
            drawMandelbrot();

		}

		else if (in.key[SDLK_KP_MINUS] || in.key[SDLK_MINUS])
		{
			if (MAX > ITER_STEP * 2)
			{
				MAX -= ITER_STEP;
                in.key[SDLK_KP_MINUS] = false;
			}
		}

		else if(in.key[SDLK_SPACE])/*On enregistre*/
		{
		    SDL_SaveBMP(SDL_GetVideoSurface(), "Mandelbrot.bmp");
		}

		else if(in.key[SDLK_TAB])
		{
		    indiceTabActu++;
		    indiceTabActu %= 12;
		    actu.pal = pointeurSurPalettes[indiceTabActu];
		    actu.taille = taillePalettes[indiceTabActu];
		    in.key[SDLK_TAB] = false;
		    drawMandelbrot();
		}

		else{}
    }
    return 0;
}

Palettes
#ifndef PALETTES_H_INCLUDED
#define PALETTES_H_INCLUDED

/*Palettes tirés de QuickMan*/

unsigned pal_0[] =
{
0x000000, 0x000000, 0x010101, 0x010101, 0x020202, 0x030303, 0x040404, 0x050505,
0x060606, 0x070707, 0x080808, 0x090909, 0x0A0A0A, 0x0B0B0B, 0x0C0C0C, 0x0D0D0D,
0x0E0E0E, 0x0F0F0F, 0x101010, 0x121212, 0x131313, 0x141414, 0x151515, 0x171717,
0x181818, 0x191919, 0x1B1B1B, 0x1C1C1C, 0x1E1E1E, 0x1F1F1F, 0x202020, 0x222222,
0x232323, 0x252525, 0x262626, 0x282828, 0x2A2A2A, 0x2B2B2B, 0x2D2D2D, 0x2E2E2E,
0x303030, 0x323232, 0x333333, 0x353535, 0x373737, 0x383838, 0x3A3A3A, 0x3C3C3C,
0x3E3E3E, 0x3F3F3F, 0x414141, 0x434343, 0x454545, 0x474747, 0x484848, 0x4A4A4A,
0x4C4C4C, 0x4E4E4E, 0x505050, 0x525252, 0x545454, 0x565656, 0x575757, 0x595959,
0x5B5B5B, 0x5D5D5D, 0x5F5F5F, 0x616161, 0x636363, 0x656565, 0x676767, 0x696969,
0x6B6B6B, 0x6D6D6D, 0x6F6F6F, 0x717171, 0x737373, 0x757575, 0x777777, 0x797979,
0x7B7B7B, 0x7D7D7D, 0x7F7F7F, 0x808080, 0x828282, 0x848484, 0x868686, 0x888888,
0x8A8A8A, 0x8C8C8C, 0x8E8E8E, 0x909090, 0x929292, 0x949494, 0x969696, 0x989898,
0x9A9A9A, 0x9C9C9C, 0x9E9E9E, 0xA0A0A0, 0xA2A2A2, 0xA3A3A3, 0xA5A5A5, 0xA7A7A7,
0xA9A9A9, 0xABABAB, 0xADADAD, 0xAFAFAF, 0xB1B1B1, 0xB2B2B2, 0xB4B4B4, 0xB6B6B6,
0xB8B8B8, 0xB9B9B9, 0xBBBBBB, 0xBDBDBD, 0xBFBFBF, 0xC0C0C0, 0xC2C2C2, 0xC4C4C4,
0xC5C5C5, 0xC7C7C7, 0xC9C9C9, 0xCACACA, 0xCCCCCC, 0xCECECE, 0xCFCFCF, 0xD1D1D1,
0xD2D2D2, 0xD4D4D4, 0xD5D5D5, 0xD7D7D7, 0xD8D8D8, 0xDADADA, 0xDBDBDB, 0xDCDCDC,
0xDEDEDE, 0xDFDFDF, 0xE0E0E0, 0xE2E2E2, 0xE3E3E3, 0xE4E4E4, 0xE5E5E5, 0xE7E7E7,
0xE8E8E8, 0xE9E9E9, 0xEAEAEA, 0xEBEBEB, 0xECECEC, 0xEDEDED, 0xEEEEEE, 0xEFEFEF,
0xF0F0F0, 0xF1F1F1, 0xF2F2F2, 0xF3F3F3, 0xF4F4F4, 0xF5F5F5, 0xF5F5F5, 0xF6F6F6,
0xF7F7F7, 0xF8F8F8, 0xF8F8F8, 0xF9F9F9, 0xF9F9F9, 0xFAFAFA, 0xFAFAFA, 0xFBFBFB,
0xFBFBFB, 0xFCFCFC, 0xFCFCFC, 0xFDFDFD, 0xFDFDFD, 0xFDFDFD, 0xFDFDFD, 0xFEFEFE,
0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFEFEFE, 0xFDFDFD, 0xFDFDFD,
0xFCFCFC, 0xFBFBFB, 0xFAFAFA, 0xF8F8F8, 0xF7F7F7, 0xF5F5F5, 0xF3F3F3, 0xF1F1F1,
0xEFEFEF, 0xECECEC, 0xEAEAEA, 0xE7E7E7, 0xE4E4E4, 0xE2E2E2, 0xDFDFDF, 0xDBDBDB,
0xD8D8D8, 0xD4D4D4, 0xD1D1D1, 0xCDCDCD, 0xCACACA, 0xC6C6C6, 0xC2C2C2, 0xBEBEBE,
0xBABABA, 0xB6B6B6, 0xB2B2B2, 0xADADAD, 0xA9A9A9, 0xA5A5A5, 0xA0A0A0, 0x9C9C9C,
0x989898, 0x939393, 0x8E8E8E, 0x8A8A8A, 0x858585, 0x818181, 0x7C7C7C, 0x777777,
0x737373, 0x6E6E6E, 0x6A6A6A, 0x656565, 0x616161, 0x5C5C5C, 0x585858, 0x535353,
0x4F4F4F, 0x4A4A4A, 0x464646, 0x424242, 0x3E3E3E, 0x3A3A3A, 0x363636, 0x323232,
0x2E2E2E, 0x2A2A2A, 0x272727, 0x232323, 0x202020, 0x1D1D1D, 0x191919, 0x161616,
0x131313, 0x101010, 0x0E0E0E, 0x0B0B0B, 0x090909, 0x070707, 0x050505, 0x030303,
};

unsigned pal_1[] =
{
0x000000, 0x0C141C, 0x182838, 0x243C54, 0x305070, 0x3C648C, 0x4878A8, 0x548CC4,
0x60A0E0, 0x6CB4FC, 0x78C8E4, 0x84DCC8, 0x90F0AC, 0x9CF890, 0xA8E474, 0xB4D058,
0xC0BC3C, 0xCCA820, 0xD89404, 0xE48014, 0xF06C30, 0xFC584C, 0xF44468, 0xE83084,
0xDC1CA0, 0xD008BC, 0xC408D8, 0xB81CF4, 0xAC30EC, 0xA044D0, 0x9458B4, 0x886C98,
0x7C807C, 0x709460, 0x64A844, 0x58BC28, 0x4CD00C, 0x40E40C, 0x34F828, 0x28F044,
0x1CDC60, 0x10C87C, 0x04B498, 0x04A0B4, 0x108CD0, 0x1C78EC, 0x2864F4, 0x3450D8,
0x403CBC, 0x4C28A0, 0x581484, 0x640068, 0x70104C, 0x7C2430, 0x883814, 0x944C04,
0xA06020, 0xAC743C, 0xB88858, 0xC49C74, 0xD0B090, 0xDCC4AC, 0xE8D8C8, 0xF4ECE4,
0x287C80, 0x887090, 0x3864A0, 0x9858B0, 0x484CC0, 0xA840D0, 0x5834E0, 0xB828F0,
0x681CFC, 0xC810EC, 0x7804DC, 0xD804CC, 0x8810BC, 0xE81CAC, 0x98289C, 0xF8348C,
0xA8407C, 0xF44C6C, 0xB8585C, 0xE4644C, 0xC8703C, 0xD47C2C, 0xD8881C, 0xC4940C,
0xE8A000, 0xB4AC10, 0xF8B820, 0xA4C430, 0xF4D040, 0x94DC50, 0xE4E860, 0x84F470,
0xD4FC80, 0x74F090, 0xC4E4A0, 0x64D8B0, 0xB4CCC0, 0x54C0D0, 0xA4B4E0, 0x44A8F0,
0x949CFC, 0x3490EC, 0x8484DC, 0x2478CC, 0x746CBC, 0x1460AC, 0x64549C, 0x04488C,
0x543C7C, 0x08306C, 0x44245C, 0x18184C, 0x340C3C, 0x28002C, 0x24081C, 0x38140C,
0x142000, 0x482C10, 0x043820, 0x584430, 0x085040, 0x685C50, 0x186860, 0x787470,
0x000000, 0x08080C, 0x101018, 0x181824, 0x202030, 0x28283C, 0x303048, 0x383854,
0x404060, 0x48486C, 0x505078, 0x585884, 0x606090, 0x68689C, 0x7070A8, 0x7878B4,
0x8080C0, 0x8888CC, 0x9090D8, 0x9898E4, 0xA0A0F0, 0xA8A8FC, 0xB0B0F4, 0xB8B8E8,
0xC0C0DC, 0xC8C8D0, 0xD0D0C4, 0xD8D8B8, 0xE0E0AC, 0xE8E8A0, 0xF0F094, 0xF8F888,
0xFCFC7C, 0xF4F470, 0xECEC64, 0xE4E458, 0xDCDC4C, 0xD4D440, 0xCCCC34, 0xC4C428,
0xBCBC1C, 0xB4B410, 0xACAC04, 0xA4A404, 0x9C9C10, 0x94941C, 0x8C8C28, 0x848434,
0x7C7C40, 0x74744C, 0x6C6C58, 0x646464, 0x5C5C70, 0x54547C, 0x4C4C88, 0x444494,
0x3C3CA0, 0x3434AC, 0x2C2CB8, 0x2424C4, 0x1C1CD0, 0x1414DC, 0x0C0CE8, 0x0404F4,
0x4850B4, 0x3CBCBC, 0x3060C4, 0x24CCCC, 0x1870D4, 0x0CDCDC, 0x0080E4, 0x08ECEC,
0x1490F4, 0x20FCFC, 0x2CA0F8, 0x38F0F0, 0x44B0E8, 0x50E0E0, 0x5CC0D8, 0x68D0D0,
0x74D0C8, 0x80C0C0, 0x8CE0B8, 0x98B0B0, 0xA4F0A8, 0xB0A0A0, 0xBCFC98, 0xC89090,
0xD4EC88, 0xE08080, 0xECDC78, 0xF87070, 0xF8CC68, 0xEC6060, 0xE0BC58, 0xD45050,
0xC8AC48, 0xBC4040, 0xB09C38, 0xA43030, 0x988C28, 0x8C2020, 0x807C18, 0x741010,
0x686C08, 0x5C0000, 0x505C04, 0x440C0C, 0x384C14, 0x2C1C1C, 0x203C24, 0x142C2C,
0x082C34, 0x003C3C, 0x0C1C44, 0x184C4C, 0x240C54, 0x305C5C, 0x3C0064, 0x486C6C,
0x541074, 0x607C7C, 0x6C2084, 0x788C8C, 0x843094, 0x909C9C, 0x9C40A4, 0xA8ACAC,
};

unsigned pal_2[] =
{
0x000000, 0x0D0606, 0x160707, 0x1F0707, 0x2B0808, 0x360808, 0x430808, 0x510909,
0x5E0909, 0x6C0909, 0x790808, 0x880909, 0x940808, 0xA10808, 0xAC0707, 0xB70606,
0xC10606, 0xCA0505, 0xD20505, 0xD90404, 0xE00404, 0xE50303, 0xEA0303, 0xEE0303,
0xF10202, 0xF40202, 0xF80101, 0xFC0101, 0xFE0000, 0xFF0000, 0xFF0000, 0xFF0100,
0xFF0400, 0xFF0800, 0xFF0C00, 0xFF1100, 0xFF1600, 0xFF1C00, 0xFF2200, 0xFF2800,
0xFF2E00, 0xFF3500, 0xFF3C00, 0xFF4300, 0xFF4A00, 0xFF5200, 0xFF5900, 0xFF6100,
0xFF6900, 0xFF7100, 0xFF7900, 0xFF8100, 0xFF8800, 0xFF9000, 0xFF9800, 0xFFA000,
0xFFA700, 0xFFAF00, 0xFFB600, 0xFFBD00, 0xFFC400, 0xFFCB00, 0xFFD100, 0xFFD700,
0xFFDD00, 0xFFE200, 0xFFE800, 0xFFEC00, 0xFFF000, 0xFFF400, 0xFFF800, 0xFFFA00,
0xFEFC00, 0xFBFC01, 0xF7FC01, 0xF3FC02, 0xEFFC03, 0xEAFC03, 0xE5FC04, 0xE0FC05,
0xDBFC05, 0xD5FC06, 0xCFFC07, 0xC9FC07, 0xC2FC08, 0xBCFA09, 0xB5F80A, 0xAEF60A,
0xA7F30B, 0xA0F10C, 0x99EE0D, 0x92EB0E, 0x8AE90F, 0x83E610, 0x7CE311, 0x74E012,
0x6DDD13, 0x66DA15, 0x5FD716, 0x58D417, 0x51D119, 0x4ACE1A, 0x43CB1C, 0x3DC81E,
0x36C61F, 0x30C321, 0x2AC123, 0x24BE25, 0x1FBC27, 0x1ABA29, 0x15B92C, 0x10B72E,
0x0CB631, 0x08B533, 0x04B436, 0x01B439, 0x00B43C, 0x00B43F, 0x00B442, 0x00B546,
0x00B64A, 0x00B74E, 0x00B852, 0x00B956, 0x00BB5B, 0x00BC60, 0x00BE65, 0x00C06A,
0x00C26F, 0x00C474, 0x00C679, 0x00C87F, 0x00CA84, 0x00CD8A, 0x00CF8F, 0x00D195,
0x00D49A, 0x00D6A0, 0x00D8A5, 0x00DBAD, 0x00DFB5, 0x00E2BD, 0x00E5C5, 0x00E7CC,
0x00EAD3, 0x00EADA, 0x00EAE0, 0x00EAE6, 0x00EAEC, 0x00EAF1, 0x00EAF5, 0x00EAF9,
0x00EAFC, 0x00EAFE, 0x00E9FF, 0x00E4FF, 0x00DFFF, 0x00D9FF, 0x00D2FD, 0x00CAFA,
0x00C2F6, 0x00B9F2, 0x00B0EE, 0x00A6E9, 0x009BE3, 0x0091DD, 0x0086D7, 0x007BD1,
0x0075CD, 0x006FCA, 0x0069C6, 0x0063C3, 0x005DBF, 0x0057BC, 0x0052B9, 0x004CB5,
0x0047B2, 0x0041AF, 0x003CAC, 0x0036A9, 0x0031A6, 0x002CA3, 0x0028A1, 0x00239E,
0x001F9C, 0x001A9A, 0x001698, 0x001396, 0x000F94, 0x000C93, 0x000992, 0x000691,
0x000390, 0x030190, 0x070090, 0x0C0090, 0x100090, 0x150090, 0x1B0090, 0x210090,
0x270091, 0x2D0092, 0x340093, 0x3B0094, 0x420096, 0x490097, 0x510099, 0x59009B,
0x60009C, 0x68009E, 0x7000A0, 0x7800A2, 0x8000A4, 0x8C00A7, 0x9800AA, 0xA400AE,
0xAF00B1, 0xBA00B4, 0xC500B7, 0xCF00BA, 0xD900BC, 0xE200BF, 0xEA00C1, 0xF200C3,
0xF800C4, 0xFE00C6, 0xFD01C5, 0xFB04C3, 0xF806C1, 0xF606C0, 0xF507BF, 0xF207BE,
0xF008BC, 0xED09BA, 0xEB0AB8, 0xE70BB6, 0xE30BB3, 0xDE0CAF, 0xD90DAC, 0xD30EA7,
0xCB0FA1, 0xC2119A, 0xB81293, 0xAD138A, 0xA01381, 0x931477, 0x86156C, 0x781462,
0x6A1457, 0x5B134B, 0x4D1240, 0x401136, 0x33102B, 0x260E21, 0x1B0C18, 0x120B10,
};

unsigned pal_3[] =
{
0x000000, 0x184048, 0x141C54, 0x101850, 0x141C4C, 0x1C204C, 0x242448, 0x2C2848,
0x302C44, 0x383044, 0x403444, 0x483840, 0x4C3C40, 0x54403C, 0x5C443C, 0x58483C,
0x584C40, 0x585040, 0x545444, 0x545844, 0x545C48, 0x50604C, 0x4C6450, 0x486854,
0x446C58, 0x40705C, 0x3C7864, 0x307C6C, 0x347C68, 0x3C8064, 0x448460, 0x488860,
0x508C5C, 0x588C58, 0x609054, 0x649454, 0x6C9850, 0x749C4C, 0x80A048, 0x8CA448,
0x98A844, 0xA4AC44, 0xB0B040, 0xBCB440, 0xCCB840, 0xDCBC40, 0xE8C03C, 0xF8C43C,
0xF8C444, 0xF8CC50, 0xF8CC58, 0xF8D468, 0xF4CC64, 0xF4C860, 0xF4C45C, 0xF4C05C,
0xF4BC58, 0xF4B454, 0xF4B050, 0xF4AC50, 0xF4A84C, 0xF4A448, 0xF49C48, 0xF49844,
0xF49440, 0xF4903C, 0xF48C3C, 0xF48438, 0xF48034, 0xF47C34, 0xF47830, 0xF4742C,
0xF46C28, 0xF46828, 0xF46424, 0xF46020, 0xF45C1C, 0xF4541C, 0xF45018, 0xF44C14,
0xF44814, 0xF44410, 0xF43C0C, 0xF43808, 0xF43408, 0xF43004, 0xF42C00, 0xEC2C00,
0xE82C00, 0xE42C04, 0xDC3004, 0xD83008, 0xD43008, 0xCC2C08, 0xC42C08, 0xBC2C08,
0xB42808, 0xAC2808, 0xA42808, 0xA02408, 0x982408, 0x902408, 0x882008, 0x802008,
0x782008, 0x701C08, 0x6C1C08, 0x641808, 0x5C1808, 0x541808, 0x4C1408, 0x441408,
0x3C1408, 0x381408, 0x301008, 0x281008, 0x201008, 0x180C08, 0x18100C, 0x1C1810,
0x1C1C14, 0x1C2018, 0x20241C, 0x202820, 0x243028, 0x242C28, 0x202828, 0x1C2428,
0x182028, 0x141C28, 0x101828, 0x101428, 0x0C1028, 0x080C28, 0x040828, 0x040828,
0x040828, 0x080C28, 0x0C1028, 0x10142C, 0x18182C, 0x1C1C30, 0x202030, 0x282434,
0x2C2838, 0x303038, 0x38343C, 0x3C383C, 0x403C40, 0x484044, 0x4C4444, 0x504848,
0x544C48, 0x5C544C, 0x605850, 0x645C50, 0x6C6054, 0x706454, 0x746858, 0x7C6C58,
0x80705C, 0x887860, 0x8C7C60, 0x908064, 0x988464, 0x9C8868, 0xA08C6C, 0xA8906C,
0xAC9470, 0xB09C70, 0xB8A074, 0xBCA478, 0xC0A878, 0xC8AC7C, 0xCCB07C, 0xD0B480,
0xD8BC84, 0xDCC088, 0xE0C488, 0xE8C88C, 0xECCC8C, 0xECC488, 0xE8C084, 0xE8BC80,
0xE8B880, 0xE8B47C, 0xE4B07C, 0xE4AC78, 0xE4AC78, 0xE4A874, 0xE4A474, 0xE0A070,
0xE09C70, 0xE0986C, 0xE0946C, 0xDC9468, 0xDC9068, 0xDC8C64, 0xDC8864, 0xDC8460,
0xD88060, 0xD8805C, 0xD87C5C, 0xD87858, 0xD87454, 0xD47054, 0xD46C50, 0xD46850,
0xD4684C, 0xD0644C, 0xD06048, 0xD05C48, 0xD05844, 0xD05444, 0xCC5440, 0xCC5040,
0xCC4C3C, 0xCC483C, 0xC84438, 0xC84038, 0xC83C34, 0xC83C34, 0xC83830, 0xC43430,
0xC4302C, 0xBC2C28, 0xB82C28, 0xB42C28, 0xB02C28, 0xAC2C28, 0xA82C28, 0xA42C28,
0x9C2C28, 0x982C28, 0x942C28, 0x902C28, 0x8C2828, 0x882828, 0x842828, 0x802828,
0x782828, 0x742828, 0x702828, 0x6C2828, 0x682828, 0x642828, 0x602828, 0x5C2828,
0x543028, 0x4C342C, 0x3C3828, 0x304024, 0x244820, 0x205820, 0x1C6814, 0x288834,
};

unsigned pal_4[] =
{
0x000000, 0x80087C, 0x7C0874, 0x780870, 0x740868, 0x740864, 0x700860, 0x6C0858,
0x680854, 0x68084C, 0x640848, 0x600C44, 0x600C3C, 0x5C0C38, 0x580C34, 0x541030,
0x54102C, 0x501028, 0x4C1024, 0x4C1420, 0x48141C, 0x441818, 0x441814, 0x401810,
0x3C1C10, 0x3C1C0C, 0x38200C, 0x342008, 0x342408, 0x302408, 0x302808, 0x2C2808,
0x2C2C04, 0x282C08, 0x283008, 0x243008, 0x243408, 0x203408, 0x20380C, 0x1C3C0C,
0x1C3C10, 0x184010, 0x184414, 0x184418, 0x14481C, 0x144C20, 0x104C24, 0x105028,
0x10542C, 0x105430, 0x0C5834, 0x0C5C38, 0x0C603C, 0x0C6044, 0x086448, 0x08684C,
0x086854, 0x086C58, 0x087060, 0x087464, 0x087468, 0x087870, 0x087C74, 0x08807C,
0x048080, 0x088084, 0x08848C, 0x088890, 0x088C98, 0x088C9C, 0x0890A0, 0x0894A8,
0x0898AC, 0x0898B4, 0x089CB8, 0x0CA0BC, 0x0CA0C4, 0x0CA4C8, 0x0CA8CC, 0x10ACD0,
0x10ACD4, 0x10B0D8, 0x10B4DC, 0x14B4E0, 0x14B8E4, 0x18BCE8, 0x18BCEC, 0x18C0F0,
0x1CC4F0, 0x1CC4F4, 0x20C8F4, 0x20CCF8, 0x24CCF8, 0x24D0F8, 0x28D0F8, 0x28D4F8,
0x2CD4FC, 0x2CD8F8, 0x30D8F8, 0x30DCF8, 0x34DCF8, 0x34E0F8, 0x38E0F4, 0x3CE4F4,
0x3CE4F0, 0x40E8F0, 0x44E8EC, 0x44E8E8, 0x48ECE4, 0x4CECE0, 0x4CF0DC, 0x50F0D8,
0x54F0D4, 0x54F0D0, 0x58F4CC, 0x5CF4C8, 0x60F4C4, 0x60F4BC, 0x64F8B8, 0x68F8B4,
0x68F8AC, 0x6CF8A8, 0x70F8A0, 0x74F89C, 0x74F898, 0x78F890, 0x7CF88C, 0x80F884,
0x80FC80, 0x80F87C, 0x84F874, 0x88F870, 0x8CF868, 0x8CF864, 0x90F860, 0x94F858,
0x98F854, 0x98F84C, 0x9CF848, 0xA0F444, 0xA0F43C, 0xA4F438, 0xA8F434, 0xACF030,
0xACF02C, 0xB0F028, 0xB4F024, 0xB4EC20, 0xB8EC1C, 0xBCE818, 0xBCE814, 0xC0E810,
0xC4E410, 0xC4E40C, 0xC8E00C, 0xCCE008, 0xCCDC08, 0xD0DC08, 0xD0D808, 0xD4D808,
0xD4D404, 0xD8D408, 0xD8D008, 0xDCD008, 0xDCCC08, 0xE0CC08, 0xE0C80C, 0xE4C40C,
0xE4C410, 0xE8C010, 0xE8BC14, 0xE8BC18, 0xECB81C, 0xECB420, 0xF0B424, 0xF0B028,
0xF0AC2C, 0xF0AC30, 0xF4A834, 0xF4A438, 0xF4A03C, 0xF4A044, 0xF89C48, 0xF8984C,
0xF89854, 0xF89458, 0xF89060, 0xF88C64, 0xF88C68, 0xF88870, 0xF88474, 0xF8807C,
0xFC8080, 0xF88084, 0xF87C8C, 0xF87890, 0xF87498, 0xF8749C, 0xF870A0, 0xF86CA8,
0xF868AC, 0xF868B4, 0xF864B8, 0xF460BC, 0xF460C4, 0xF45CC8, 0xF458CC, 0xF054D0,
0xF054D4, 0xF050D8, 0xF04CDC, 0xEC4CE0, 0xEC48E4, 0xE844E8, 0xE844EC, 0xE840F0,
0xE43CF0, 0xE43CF4, 0xE038F4, 0xE034F8, 0xDC34F8, 0xDC30F8, 0xD830F8, 0xD82CF8,
0xD42CFC, 0xD428F8, 0xD028F8, 0xD024F8, 0xCC24F8, 0xCC20F8, 0xC820F4, 0xC41CF4,
0xC41CF0, 0xC018F0, 0xBC18EC, 0xBC18E8, 0xB814E4, 0xB414E0, 0xB410DC, 0xB010D8,
0xAC10D4, 0xAC10D0, 0xA80CCC, 0xA40CC8, 0xA00CC4, 0xA00CBC, 0x9C08B8, 0x9808B4,
0x9808AC, 0x9408A8, 0x9008A0, 0x8C089C, 0x8C0898, 0x880890, 0x84088C, 0x800884,
};

unsigned pal_5[] =
{
0x000000, 0x010101, 0x010101, 0x010101, 0x010101, 0x030201, 0x030201, 0x040301,
0x040301, 0x040301, 0x060401, 0x060401, 0x070501, 0x090601, 0x090601, 0x090601,
0x0A0701, 0x0A0701, 0x0B0801, 0x0D0901, 0x0D0901, 0x0E0A01, 0x100B01, 0x100B01,
0x110C01, 0x110C01, 0x130D01, 0x140E01, 0x150F01, 0x171001, 0x171001, 0x171001,
0x181101, 0x1A1201, 0x1B1301, 0x1D1401, 0x1E1501, 0x201601, 0x211701, 0x211701,
0x221801, 0x241901, 0x241901, 0x251A01, 0x271B01, 0x281C01, 0x2A1D01, 0x2B1E01,
0x2B1E01, 0x2C1F01, 0x2E2001, 0x2F2101, 0x312201, 0x322301, 0x342401, 0x352501,
0x382701, 0x392801, 0x3B2901, 0x3C2A01, 0x3C2A01, 0x3E2B01, 0x3F2B00, 0x412D02,
0x422E03, 0x432F04, 0x443005, 0x453106, 0x463207, 0x483409, 0x49350A, 0x4A360B,
0x4B370C, 0x4C380D, 0x4E3A0F, 0x4F3B10, 0x503C11, 0x513D12, 0x533F14, 0x533F14,
0x544015, 0x554116, 0x574318, 0x584419, 0x59451A, 0x5A461B, 0x5C481D, 0x5D491E,
0x5E4A1F, 0x5F4B20, 0x604C21, 0x614D22, 0x634F24, 0x645025, 0x655126, 0x665227,
0x685429, 0x69552A, 0x6A562B, 0x6C582D, 0x6D592E, 0x6E5A2F, 0x705C31, 0x715D32,
0x725E33, 0x746035, 0x756136, 0x766237, 0x786439, 0x79653A, 0x7A663B, 0x7C683D,
0x7D693E, 0x7E6A3F, 0x806C41, 0x816D42, 0x826E43, 0x847045, 0x857146, 0x887449,
0x89754A, 0x8A764B, 0x8B774C, 0x8D794E, 0x8E7A4F, 0x907C51, 0x907C51, 0x917D52,
0x937F54, 0x948055, 0x958156, 0x978358, 0x988459, 0x99855A, 0x9A865B, 0x9C885D,
0x9D895E, 0x9E8A5F, 0xA08C61, 0xA18D62, 0xA38F64, 0xA59166, 0xA69267, 0xA79368,
0xA9956A, 0xAA966B, 0xAB976C, 0xAC986D, 0xAE9A6F, 0xAF9B70, 0xB09C71, 0xB29E73,
0xB39F74, 0xB4A075, 0xB5A176, 0xB8A479, 0xB9A57A, 0xBAA67B, 0xBBA77C, 0xBDA97E,
0xBEAA7F, 0xBFAB80, 0xC0AC81, 0xC1AD82, 0xC2AE83, 0xC3AF84, 0xC4B085, 0xC5B186,
0xC6B287, 0xC9B58A, 0xCAB68B, 0xCBB78C, 0xCCB88D, 0xCDB98E, 0xCEBA8F, 0xD0BC91,
0xD1BD92, 0xD2BE93, 0xD3BF94, 0xD4C095, 0xD5C196, 0xD7C398, 0xD8C499, 0xD9C59A,
0xDAC69B, 0xDBC79C, 0xDCC89D, 0xDDC99E, 0xDFCBA0, 0xE0CCA1, 0xE1CDA2, 0xE2CEA3,
0xE3CFA4, 0xE5D1A6, 0xE6D2A7, 0xE7D3A8, 0xE7D3A8, 0xE8D4A9, 0xE9D5AA, 0xEAD6AB,
0xEBD7AC, 0xECD8AD, 0xEDD9AE, 0xEEDAAF, 0xEFDBB0, 0xF0DCB1, 0xF0DCB1, 0xF2DEB3,
0xF3DFB4, 0xF4E0B5, 0xF4E0B5, 0xF4E0B5, 0xF5E1B6, 0xF6E2B7, 0xF7E3B8, 0xF7E3B8,
0xF8E4B9, 0xF9E5BA, 0xFAE6BB, 0xFAE6BB, 0xFBE7BC, 0xFDE9BE, 0xFDE9BE, 0xFEEABF,
0xFFEBC0, 0xFFEBC0, 0xFFEDC4, 0xFFEDC4, 0xFFEEC8, 0xFFEEC8, 0xFFEFCB, 0xFFF0CE,
0xFFF0CE, 0xFFF1D2, 0xFFF1D2, 0xFFF1D2, 0xFFF2D5, 0xFFF2D5, 0xFFF3D8, 0xFFF3D8,
0xFFF5DF, 0xFFF5DF, 0xFFF5DF, 0xFFF6E2, 0xFFF6E2, 0xFFF6E2, 0xFFF7E5, 0xFFF7E5,
0xFFF7E5, 0xFFF7E5, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9,
0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC, 0xFFF9EC,
0xFFF9EC, 0xFFF9EC, 0xFFF8E9, 0xFFF8E9, 0xFFF8E9, 0xFFF7E5, 0xFFF6E2, 0xFFF6E2,
0xFFF5DF, 0xFFF3D8, 0xFFF2D5, 0xFFF1D2, 0xFFF0CE, 0xFFEEC8, 0xFFEDC4, 0xFFEBC0,
0xFDE9BE, 0xFBE7BC, 0xF9E5BA, 0xF7E3B8, 0xF5E1B6, 0xF4E0B5, 0xF3DFB4, 0xF0DCB1,
0xEEDAAF, 0xECD8AD, 0xEAD6AB, 0xE8D4A9, 0xE5D1A6, 0xE2CEA3, 0xE0CCA1, 0xDDC99E,
0xDBC79C, 0xD8C499, 0xD5C196, 0xD2BE93, 0xD0BC91, 0xCDB98E, 0xCAB68B, 0xC8B489,
0xC4B085, 0xC2AE83, 0xBFAB80, 0xBCA87D, 0xBAA67B, 0xB6A277, 0xB39F74, 0xB09C71,
0xAD996E, 0xAA966B, 0xA79368, 0xA49065, 0xA08C61, 0x9D895E, 0x9A865B, 0x978358,
0x937F54, 0x907C51, 0x8E7A4F, 0x8B774C, 0x887449, 0x847045, 0x816D42, 0x7E6A3F,
0x7B673C, 0x776338, 0x746035, 0x715D32, 0x6E5A2F, 0x6B572C, 0x685429, 0x655126,
0x624E23, 0x5F4B20, 0x5D491E, 0x5A461B, 0x574318, 0x544015, 0x523E13, 0x4F3B10,
0x4C380D, 0x49350A, 0x473308, 0x443005, 0x412D02, 0x3E2B01, 0x3C2A01, 0x382701,
0x352501, 0x312201, 0x2E2001, 0x2B1E01, 0x281C01, 0x251A01, 0x221801, 0x211701,
0x1E1501, 0x1B1301, 0x181101, 0x171001, 0x140E01, 0x110C01, 0x100B01, 0x0D0901,
0x0B0801, 0x090601, 0x090601, 0x060401, 0x040301, 0x030201, 0x010101, 0x010101,
};

unsigned pal_6[] =
{
0x000000, 0xB8A074, 0xBCA478, 0xC0A878, 0xC8AC7C, 0xCCB07C, 0xD0B480, 0xD8BC84,
0xDCC088, 0xE0C488, 0xE8C88C, 0xECCC8C, 0xECC488, 0xE8C084, 0xE8BC80, 0xE8B880,
0xE8B47C, 0xE4B07C, 0xE4AC78, 0xE4AC78, 0xE4A874, 0xE4A474, 0xE0A070, 0xE09C70,
0xE0986C, 0xE0946C, 0xDC9468, 0xDC9068, 0xDC8C64, 0xDC8864, 0xDC8460, 0xD88060,
0xD8805C, 0xD87C5C, 0xD87858, 0xD87454, 0xD47054, 0xD46C50, 0xD0684C, 0xCC684C,
0xC8684C, 0xC8644C, 0xC4644C, 0xC0644C, 0xC06048, 0xBC6048, 0xB86048, 0xB85C48,
0xB45C48, 0xB05C48, 0xAC5844, 0xAC5844, 0xA85844, 0xA45444, 0xA45444, 0xA05444,
0x9C5040, 0x9C5040, 0x985040, 0x944C40, 0x944C40, 0x904C40, 0x8C483C, 0x88483C,
0x88483C, 0x84443C, 0x80443C, 0x80443C, 0x784038, 0x743C38, 0x6C3C34, 0x683834,
0x643430, 0x5C3430, 0x58302C, 0x542C2C, 0x4C2C28, 0x482828, 0x402824, 0x3C2424,
0x382020, 0x302020, 0x2C1C1C, 0x28181C, 0x201818, 0x1C1418, 0x181418, 0x1C1818,
0x201C1C, 0x24201C, 0x282420, 0x2C2824, 0x302C28, 0x38302C, 0x3C342C, 0x403830,
0x443C34, 0x484038, 0x50443C, 0x50443C, 0x50483C, 0x50483C, 0x504C40, 0x504C40,
0x505040, 0x545444, 0x545844, 0x545C48, 0x50604C, 0x4C6450, 0x486854, 0x446C58,
0x40705C, 0x3C7864, 0x307C6C, 0x347C68, 0x3C8064, 0x448460, 0x488860, 0x508C5C,
0x588C58, 0x609054, 0x649454, 0x6C9850, 0x749C4C, 0x80A048, 0x8CA448, 0x98A844,
0xA4AC44, 0xB0B040, 0xBCB440, 0xCCB840, 0xDCBC40, 0xE8C03C, 0xF8C43C, 0xF8C444,
0xF8CC50, 0xF8CC58, 0xF8D468, 0xF4CC64, 0xF4C860, 0xF4C45C, 0xF4C05C, 0xF4BC58,
0xF4B454, 0xF0B050, 0xECAC50, 0xECA84C, 0xE8A44C, 0xE8A04C, 0xE49C48, 0xE49848,
0xE09448, 0xDC9044, 0xDC8C44, 0xD88844, 0xD88440, 0xD48040, 0xD47C40, 0xD0783C,
0xD0743C, 0xCC703C, 0xC86C38, 0xC86838, 0xC46434, 0xC46034, 0xC05C34, 0xC05830,
0xBC5430, 0xBC5030, 0xB84C2C, 0xB4482C, 0xB4442C, 0xB04028, 0xB03C28, 0xAC3828,
0xAC3424, 0xA83024, 0xA02C24, 0x982C28, 0x942C28, 0x8C282C, 0x88282C, 0x802830,
0x7C2430, 0x742434, 0x702438, 0x6C2434, 0x682434, 0x642434, 0x602030, 0x5C2030,
0x5C2030, 0x58202C, 0x54202C, 0x50202C, 0x4C2028, 0x4C2028, 0x482028, 0x441C24,
0x401C24, 0x3C1C24, 0x381C20, 0x381C20, 0x341C20, 0x301C1C, 0x2C1C1C, 0x281C1C,
0x281C1C, 0x281C18, 0x281C14, 0x281C14, 0x2C1C18, 0x2C2018, 0x2C201C, 0x30201C,
0x30201C, 0x30201C, 0x342420, 0x342420, 0x342420, 0x382824, 0x382824, 0x3C2C28,
0x3C3028, 0x40302C, 0x40342C, 0x443430, 0x443830, 0x483C34, 0x483C34, 0x4C4038,
0x4C4038, 0x50443C, 0x50483C, 0x544840, 0x544C40, 0x584C44, 0x585044, 0x5C5448,
0x5C5448, 0x60584C, 0x645C50, 0x6C6054, 0x706454, 0x746858, 0x7C6C58, 0x80705C,
0x887860, 0x8C7C60, 0x908064, 0x988464, 0x9C8868, 0xA08C6C, 0xA8906C, 0xAC9470,
};

unsigned pal_7[] =
{
0x000000, 0x030100, 0x0C0201, 0x1C0503, 0x320806, 0x4D0E0A, 0x73140F, 0x9E1A13,
0xCC2318, 0xFF2B20, 0xFF3827, 0xFF4430, 0xFF513B, 0xFF6146, 0xFF7051, 0xFF825E,
0xFF946B, 0xFFA87C, 0xFFAF7F, 0xFF9B70, 0xFF8863, 0xFF7956, 0xFF6B4D, 0xFF5C42,
0xFF4D38, 0xFF4230, 0xFF3627, 0xFF2D20, 0xC52117, 0x881611, 0x58100B, 0x340906,
0x180403, 0x080101, 0x000000, 0x010101, 0x060607, 0x0F0F11, 0x1C1D20, 0x2D2F32,
0x404249, 0x565861, 0x63666D, 0x737582, 0x828591, 0x9197A5, 0xA5A8B5, 0xB5BCCC,
0xCCD3E2, 0xDEE6FB, 0xF7FBFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF, 0xFFFFFF,
0xFFFFFF, 0xF3FBFF, 0xDAE2F7, 0xC8CCDE, 0xB2B9C8, 0x9EA5B2, 0x8E919E, 0x7C7F8B,
0x6B7079, 0x5E6168, 0x4D4F56, 0x393B40, 0x29292F, 0x1C1C1E, 0x111112, 0x080808,
0x020202, 0x000000, 0x000001, 0x010108, 0x030312, 0x050620, 0x080934, 0x0B0E4B,
0x11136B, 0x15188B, 0x1C20B2, 0x2127DA, 0x2930FF, 0x343BFF, 0x3B46FF, 0x4651FF,
0x515EFF, 0x616DFF, 0x6B7CFF, 0x798BFF, 0x889EFF, 0x8294FF, 0x7082FF, 0x6373FF,
0x5663FF, 0x4B54FF, 0x3D49FF, 0x343BFF, 0x2930FF, 0x2126DA, 0x1A1EA8, 0x13167C,
0x0E1056, 0x090A39, 0x050621, 0x020311, 0x010104, 0x000000, 0x010100, 0x080601,
0x130F02, 0x241C05, 0x382D08, 0x51400B, 0x705810, 0x947514, 0xBC941A, 0xEBB920,
0xFFE227, 0xFFFF2F, 0xFFFF38, 0xFFFF42, 0xFFFF4B, 0xFFFF54, 0xFFFF61, 0xFFFF6D,
0xFFFF79, 0xFFFF6D, 0xFFFF61, 0xFFFF54, 0xFFFF49, 0xFFFF40, 0xFFFF36, 0xFFFF2D,
0xFFD724, 0xDAAF1E, 0xAB8817, 0x826612, 0x5E4B0C, 0x3D3008, 0x261E05, 0x141002,
0x080601, 0x010100, 0x000100, 0x010600, 0x031000, 0x071E00, 0x0B3601, 0x114F01,
0x176D01, 0x1E9101, 0x27B902, 0x32EB02, 0x3DFF03, 0x4BFF04, 0x5CFF04, 0x6BFF06,
0x7FFF06, 0x91FF07, 0xA5FF08, 0xBCFF09, 0xD3FF0B, 0xCFFF0A, 0xB9FF09, 0xA5FF08,
0x91FF07, 0x7FFF06, 0x6DFF06, 0x5EFF04, 0x4FFF04, 0x40FF03, 0x34F702, 0x2BC802,
0x219E02, 0x1A7901, 0x125401, 0x0C3901, 0x082400, 0x041400, 0x020800, 0x000100,
0x000000, 0x000106, 0x000313, 0x000829, 0x000E46, 0x00146B, 0x001C94, 0x0026C8,
0x0030FF, 0x003DFF, 0x004BFF, 0x0058FF, 0x006BFF, 0x007FFF, 0x0091FF, 0x00A5FF,
0x00B9FF, 0x00C5FF, 0x00AFFF, 0x0097FF, 0x0082FF, 0x006DFF, 0x005CFF, 0x004BFF,
0x003BFF, 0x0030FF, 0x0024C1, 0x001888, 0x00115C, 0x000B38, 0x00061D, 0x00020A,
0x000001, 0x010000, 0x080200, 0x160700, 0x2F0F01, 0x4D1701, 0x702301, 0x9E3002,
0xCF4003, 0xFF5103, 0xFF6604, 0xFF7C06, 0xFF9406, 0xFFB208, 0xFFCF09, 0xFFEF0A,
0xFFFF0B, 0xFFFF0E, 0xFFFF0C, 0xFFFF0B, 0xFFEB0A, 0xFFD309, 0xFFB908, 0xFFA207,
0xFF8E06, 0xFF7905, 0xFF6804, 0xFF5604, 0xEB4903, 0xBC3902, 0x972F02, 0x732301,
0x511801, 0x381201, 0x240B00, 0x140600, 0x080200, 0x010000, 0x000000, 0x060101,
0x140504, 0x2D0B09, 0x4B1410, 0x701E17, 0x9E2B20, 0xD7392B, 0xFF4B39, 0xFF5E49,
0xFF7358, 0xFF8B6B, 0xFFA57F, 0xFFC597, 0xFFE2AF, 0xFFFFC8, 0xFFFFCC, 0xFFE2AF,
0xFFC194, 0xFFA57C, 0xFF8868, 0xFF6D54, 0xFF5642, 0xFB4232, 0xB93226, 0x82231A,
0x541612, 0x2F0C09, 0x150604, 0x060201, 0x000000, 0x020103, 0x08020B, 0x120518,
0x20092B, 0x300F44, 0x491563, 0x631D88, 0x8226AF, 0xA22FDE, 0xC839FF, 0xF746FF,
0xFF54FF, 0xFF63FF, 0xFF73FF, 0xFF85FF, 0xFF97FF, 0xFFABFF, 0xFFC1FF, 0xFFD3FF,
0xFFDEFF, 0xFFC8FF, 0xFFB5FF, 0xFFA2FF, 0xFF8EFF, 0xFF79FF, 0xFF6BFF, 0xFF5CFF,
0xFF4DFF, 0xD73DFF, 0xAF32F3, 0x8B29C1, 0x6B2094, 0x4F176D, 0x36104B, 0x230A30,
0x14061C, 0x09020C, 0x020103, 0x000000, 0x020100, 0x080400, 0x130800, 0x241100,
0x381800, 0x4F2300, 0x6B3000, 0x8B3D00, 0xB55100, 0xDE6300, 0xFF7900, 0xFF8E00,
0xFFA500, 0xFFC500, 0xFFDE00, 0xFFFF00, 0xFFFF00, 0xFFFF01, 0xFFFF01, 0xFFFF01,
0xFFFF01, 0xFFFF01, 0xFFFF01, 0xFFFF01, 0xFFFF01, 0xFFFF00, 0xFFFF00, 0xFFD700,
0xFFB500, 0xFF9700, 0xFF7C00, 0xDA6300, 0xAB4D00, 0x7F3900, 0x5C2900, 0x3D1C00,
0x231000, 0x120800, 0x060200, 0x000000, 0x010000, 0x050000, 0x0C0000, 0x170000,
0x260000, 0x390000, 0x4F0000, 0x630000, 0x730000, 0x850000, 0x9B0000, 0xAF0000,
0xC50000, 0xDA0000, 0xF70101, 0xFF0101, 0xFF0101, 0xFF0101, 0xFF0101, 0xFF0101,
0xFF0101, 0xF70101, 0xDA0000, 0xC50000, 0xA80000, 0x910000, 0x7C0000, 0x680000,
0x560000, 0x440000, 0x340000, 0x270000, 0x1C0000, 0x120000, 0x0A0000, 0x040000,
0x010000,
};

unsigned pal_8[] =
{
0x000000, 0x288834, 0x1C6814, 0x205820, 0x244820, 0x304024, 0x3C3828, 0x4C342C,
0x583028, 0x682C28, 0x3C2828, 0x842828, 0x0C2828, 0x8C2828, 0x182828, 0x182828,
0xA42828, 0x782828, 0x442828, 0x502828, 0x582828, 0x682828, 0x782828, 0x8C2828,
0x942828, 0x9C2828, 0xA42828, 0xB02828, 0xB82828, 0xC42828, 0xD42828, 0xE02828,
0xE02828, 0xE02C28, 0xE02C2C, 0xE0302C, 0xE0302C, 0xE03430, 0xE43830, 0xE43830,
0xE43C34, 0xE43C34, 0xE44034, 0xE44038, 0xE44438, 0xE8483C, 0xE8483C, 0xE84C3C,
0xE84C40, 0xE85040, 0xE85040, 0xE85444, 0xE85444, 0xEC5844, 0xEC5C48, 0xEC5C48,
0xEC6048, 0xEC604C, 0xEC644C, 0xF06850, 0xF07054, 0xF07458, 0xF07C58, 0xF0805C,
0xF08860, 0xF08C64, 0xF09068, 0xEC986C, 0xEC9C70, 0xECA470, 0xECA874, 0xECAC78,
0xECB47C, 0xECB880, 0xECC084, 0xECC488, 0xECCC8C, 0xE8C88C, 0xE0C488, 0xDCC088,
0xD8BC84, 0xD0B480, 0xCCB07C, 0xC8AC7C, 0xC0A878, 0xBCA478, 0xB8A074, 0xB09C70,
0xAC9470, 0xA8906C, 0xA08C6C, 0x9C8868, 0x988464, 0x908064, 0x8C7C60, 0x887860,
0x80705C, 0x7C6C58, 0x746858, 0x706454, 0x6C6054, 0x645C50, 0x605850, 0x5C544C,
0x544C48, 0x504848, 0x4C4444, 0x484044, 0x403C40, 0x3C383C, 0x38343C, 0x303038,
0x2C2838, 0x282434, 0x202030, 0x1C1C30, 0x18182C, 0x10142C, 0x0C1028, 0x080C28,
0x040828, 0x040828, 0x040828, 0x080C28, 0x0C1028, 0x101428, 0x101828, 0x141C28,
0x182028, 0x1C2428, 0x202828, 0x242C28, 0x243028, 0x283428, 0x2C3828, 0x202C20,
0x182018, 0x0C0C08, 0x100C08, 0x180C08, 0x201008, 0x281008, 0x301008, 0x381408,
0x3C1408, 0x441408, 0x4C1408, 0x541808, 0x5C1808, 0x641808, 0x6C1C08, 0x701C08,
0x782008, 0x802008, 0x882008, 0x902408, 0x982408, 0xA02408, 0xA42808, 0xAC2808,
0xB42808, 0xBC2C08, 0xC42C08, 0xCC2C08, 0xD43008, 0xD83008, 0xDC3004, 0xE42C04,
0xE82C00, 0xEC2C00, 0xF42C00, 0xF43004, 0xF43408, 0xF43808, 0xF43C0C, 0xF44410,
0xF44814, 0xF44C14, 0xF45018, 0xF4541C, 0xF45C1C, 0xF46020, 0xF46424, 0xF46828,
0xF46C28, 0xF4742C, 0xF47830, 0xF47C34, 0xF48034, 0xF48438, 0xF48C3C, 0xF4903C,
0xF49440, 0xF49844, 0xF49C48, 0xF4A448, 0xF4A84C, 0xF4AC50, 0xF4B050, 0xF4B454,
0xF4BC58, 0xF4C05C, 0xF4C45C, 0xF4C860, 0xF4CC64, 0xF8D468, 0xF8CC58, 0xF8CC50,
0xF8C444, 0xF8C43C, 0xF8C434, 0xF8C028, 0xF8C018, 0xF8B810, 0xF8B80C, 0xF8B408,
0xF8B404, 0xF8B004, 0xF8B008, 0xF8A80C, 0xF8A810, 0xF8A418, 0xF8A440, 0xEC9C3C,
0xE4983C, 0xDC943C, 0xD48C3C, 0xCC883C, 0xC48038, 0xBC7C38, 0xB47838, 0xAC7438,
0xA47038, 0x9C6C38, 0x946838, 0x8C6438, 0x886034, 0x805834, 0x785434, 0x705038,
0x684C38, 0x64483C, 0x5C443C, 0x54403C, 0x4C3C40, 0x483840, 0x403444, 0x383044,
0x302C44, 0x2C2848, 0x242448, 0x1C204C, 0x141C4C, 0x101850, 0x141C54, 0x1C1C28,
};

unsigned pal_9[] =
{
0x000000, 0x040404, 0x0C0C0C, 0x101414, 0x181C1C, 0x1C2824, 0x243028, 0x283830,
0x304038, 0x34483C, 0x3C5044, 0x445848, 0x4C6050, 0x506854, 0x58705C, 0x607860,
0x688068, 0x70886C, 0x789070, 0x809878, 0x88A07C, 0x90A880, 0x9CB084, 0xA4B88C,
0xACC090, 0xB4C894, 0xC0CC9C, 0xC8D4A0, 0xD4D8A8, 0xDCE0AC, 0xE4E4B4, 0xF0ECB8,
0xF4ECD0, 0xECE4CC, 0xE4DCC4, 0xE0D4BC, 0xD8C8B8, 0xD0C0B0, 0xC8B8AC, 0xC0B0A4,
0xB8A8A0, 0xB0A098, 0xA89890, 0xA0908C, 0x988884, 0x908080, 0x887878, 0x807070,
0x78686C, 0x706064, 0x68585C, 0x605058, 0x584850, 0x504448, 0x483C44, 0x40343C,
0x342C34, 0x2C282C, 0x242024, 0x1C181C, 0x141414, 0x0C0C0C, 0x040404, 0x000000,
0x000000, 0x040408, 0x0C0C10, 0x141018, 0x1C1820, 0x201C28, 0x282430, 0x2C2C38,
0x343040, 0x3C3848, 0x404050, 0x484858, 0x4C4C60, 0x505468, 0x585C70, 0x5C6478,
0x646C80, 0x687488, 0x6C8090, 0x748898, 0x7890A0, 0x7C98A8, 0x84A0AC, 0x88ACB4,
0x90B4B8, 0x94BCC0, 0x9CC8C8, 0xA0D0CC, 0xA8DCD0, 0xACE4D8, 0xB4ECDC, 0xBCF8E0,
0xD4F8E8, 0xCCF0E0, 0xC8E8D8, 0xC0E0CC, 0xBCD8C4, 0xB4D0BC, 0xACC8B4, 0xA8C0AC,
0xA0B8A4, 0x9CB09C, 0x94A894, 0x90A08C, 0x889884, 0x84907C, 0x7C8874, 0x74806C,
0x707864, 0x687060, 0x606858, 0x586050, 0x545448, 0x4C4C44, 0x44443C, 0x3C3C34,
0x34342C, 0x2C2C28, 0x242420, 0x1C1C18, 0x141414, 0x100C0C, 0x080404, 0x000000,
0x000000, 0x080404, 0x100C0C, 0x181410, 0x201818, 0x282020, 0x302424, 0x382C2C,
0x403034, 0x48383C, 0x503C44, 0x584448, 0x604850, 0x685058, 0x705460, 0x78586C,
0x806074, 0x84647C, 0x8C6C84, 0x94708C, 0x9C7898, 0xA07CA0, 0xA884A8, 0xAC88B0,
0xB490BC, 0xB894C4, 0xC09CCC, 0xC4A4D8, 0xC8A8E0, 0xCCB0E8, 0xD4B8F0, 0xD8C0F8,
0xE0D8F8, 0xD8D0F0, 0xD0CCE8, 0xC8C4E0, 0xC0C0D8, 0xB8B8D0, 0xB0B4C8, 0xA8ACC0,
0xA0A4B8, 0x98A0B0, 0x9098A8, 0x8894A0, 0x808C98, 0x788490, 0x748088, 0x6C787C,
0x647074, 0x5C6C6C, 0x586464, 0x505C5C, 0x485454, 0x444C4C, 0x3C4444, 0x343C3C,
0x2C3434, 0x28302C, 0x202824, 0x18201C, 0x141814, 0x0C100C, 0x040804, 0x000000,
0x000000, 0x040804, 0x0C100C, 0x101810, 0x182018, 0x202820, 0x283024, 0x30382C,
0x344030, 0x3C4834, 0x44503C, 0x4C5840, 0x546048, 0x5C644C, 0x686C54, 0x707458,
0x787C60, 0x808064, 0x88886C, 0x949070, 0x9C9478, 0xA49C7C, 0xACA084, 0xB8A488,
0xC0AC90, 0xC8B098, 0xD0B4A0, 0xD8BCA8, 0xE0C0B0, 0xE8C4B8, 0xF0C8C0, 0xF8CCC8,
0xF8DCDC, 0xF0D4D4, 0xE8CCD0, 0xE0C4C8, 0xD8BCC4, 0xD0B4BC, 0xC8ACB8, 0xC0A4B0,
0xB89CAC, 0xB094A4, 0xA88C9C, 0x9C8898, 0x948090, 0x8C7888, 0x847084, 0x7C6C7C,
0x746474, 0x6C5C6C, 0x645864, 0x5C505C, 0x504858, 0x484450, 0x403C48, 0x383440,
0x343038, 0x2C2830, 0x242028, 0x1C1C20, 0x141418, 0x0C0C10, 0x040408, 0x000000,
};

unsigned pal_10[] =
{
0x000000, 0x040000, 0x0C0000, 0x140000, 0x1C0000, 0x240000, 0x2C0000, 0x340000,
0x3C0000, 0x440000, 0x4C0000, 0x540000, 0x5C0000, 0x640000, 0x6C0000, 0x740000,
0x7C0000, 0x840000, 0x8C0000, 0x940000, 0x9C0000, 0xA40000, 0xAC0000, 0xB40000,
0xBC0000, 0xC40000, 0xCC0000, 0xD40000, 0xDC0000, 0xE40000, 0xEC0000, 0xF40000,
0xFC0000, 0xFC0404, 0xFC0C0C, 0xFC1414, 0xFC1C1C, 0xFC2424, 0xFC2C2C, 0xFC3434,
0xFC3C3C, 0xFC4444, 0xFC4C4C, 0xFC5454, 0xFC5C5C, 0xFC6464, 0xFC6C6C, 0xFC7474,
0xFC7C7C, 0xFC8484, 0xFC8C8C, 0xFC9494, 0xFC9C9C, 0xFCA4A4, 0xFCACAC, 0xFCB4B4,
0xFCBCBC, 0xFCC4C4, 0xFCCCCC, 0xFCD4D4, 0xFCDCDC, 0xFCE4E4, 0xFCECEC, 0xFCF4F4,
0xFCFCFC, 0xFCF8F4, 0xFCF8EC, 0xFCF4E4, 0xFCF4DC, 0xFCF0D4, 0xFCF0CC, 0xFCECC4,
0xFCECBC, 0xFCE8B4, 0xFCE8AC, 0xFCE4A4, 0xFCE49C, 0xFCE094, 0xFCE08C, 0xFCDC84,
0xFCDC7C, 0xFCDC74, 0xFCD86C, 0xFCD864, 0xFCD45C, 0xFCD454, 0xFCD04C, 0xFCD044,
0xFCCC3C, 0xFCCC34, 0xFCC82C, 0xFCC824, 0xFCC41C, 0xFCC414, 0xFCC00C, 0xFCC004,
0xFCC000, 0xF4B800, 0xECB400, 0xE4AC00, 0xDCA800, 0xD4A000, 0xCC9C00, 0xC49400,
0xBC9000, 0xB48800, 0xAC8400, 0xA47C00, 0x9C7800, 0x947000, 0x8C6C00, 0x846400,
0x7C6000, 0x745800, 0x6C5400, 0x644C00, 0x5C4800, 0x544000, 0x4C3C00, 0x443400,
0x3C3000, 0x342800, 0x2C2400, 0x241C00, 0x1C1800, 0x141000, 0x0C0C00, 0x040400,
0x000000, 0x040400, 0x0C0800, 0x140C00, 0x1C1000, 0x241400, 0x2C1800, 0x341C00,
0x3C2000, 0x442400, 0x4C2800, 0x542C00, 0x5C3000, 0x643400, 0x6C3800, 0x743C00,
0x7C4000, 0x844400, 0x8C4800, 0x944C00, 0x9C5000, 0xA45400, 0xAC5800, 0xB45C00,
0xBC6000, 0xC46400, 0xCC6800, 0xD46C00, 0xDC7000, 0xE47400, 0xEC7800, 0xF47C00,
0xFC8000, 0xFC8004, 0xFC840C, 0xFC8814, 0xFC8C1C, 0xFC9024, 0xFC942C, 0xFC9834,
0xFC9C3C, 0xFCA044, 0xFCA44C, 0xFCA854, 0xFCAC5C, 0xFCB064, 0xFCB46C, 0xFCB874,
0xFCBC7C, 0xFCC084, 0xFCC48C, 0xFCC894, 0xFCCC9C, 0xFCD0A4, 0xFCD4AC, 0xFCD8B4,
0xFCDCBC, 0xFCE0C4, 0xFCE4CC, 0xFCE8D4, 0xFCECDC, 0xFCF0E4, 0xFCF4EC, 0xFCF8F4,
0xFCFCFC, 0xFCF8F4, 0xFCF8EC, 0xFCF4E4, 0xFCF4DC, 0xFCF0D4, 0xFCF0CC, 0xFCECC4,
0xFCECBC, 0xFCE8B4, 0xFCE8AC, 0xFCE4A4, 0xFCE49C, 0xFCE094, 0xFCE08C, 0xFCDC84,
0xFCDC7C, 0xFCDC74, 0xFCD86C, 0xFCD864, 0xFCD45C, 0xFCD454, 0xFCD04C, 0xFCD044,
0xFCCC3C, 0xFCCC34, 0xFCC82C, 0xFCC824, 0xFCC41C, 0xFCC414, 0xFCC00C, 0xFCC004,
0xFCC000, 0xF4B800, 0xECB400, 0xE4AC00, 0xDCA800, 0xD4A000, 0xCC9C00, 0xC49400,
0xBC9000, 0xB48800, 0xAC8400, 0xA47C00, 0x9C7800, 0x947000, 0x8C6C00, 0x846400,
0x7C6000, 0x745800, 0x6C5400, 0x644C00, 0x5C4800, 0x544000, 0x4C3C00, 0x443400,
0x3C3000, 0x342800, 0x2C2400, 0x241C00, 0x1C1800, 0x141000, 0x0C0C00, 0x040400,
};

unsigned pal_11[] =
{
0x000000, 0x020201, 0x0F0E0C, 0x1D1C19, 0x2D2B27, 0x393833, 0x46443D, 0x514E47,
0x5B5850, 0x646057, 0x676358, 0x6A6658, 0x6C6758, 0x6E6957, 0x706A57, 0x736C56,
0x766E55, 0x7B7257, 0x847B5F, 0x8C8466, 0x958C70, 0x9E9578, 0xA69D80, 0xAEA588,
0xB5AB8F, 0xBAB194, 0xBCB393, 0xBEB393, 0xC0B593, 0xC2B791, 0xC4B790, 0xC6B990,
0xC9BB90, 0xCDBE91, 0xD2C597, 0xD7C99C, 0xDCCEA2, 0xE1D3A7, 0xE5D8AD, 0xE9DCB2,
0xEDDFB6, 0xEFE2B9, 0xEDE0B6, 0xE9DBB1, 0xE5D7AC, 0xE1D3A7, 0xDDCEA1, 0xD7C99C,
0xD2C496, 0xCCBF91, 0xC9BD91, 0xC7BB91, 0xC3B891, 0xC1B692, 0xBFB693, 0xBDB494,
0xBBB394, 0xB7B093, 0xB1AA8E, 0xAAA386, 0xA19C7E, 0x9A9377, 0x908A6D, 0x878164,
0x7E795D, 0x767257, 0x716D54, 0x6D6A53, 0x6A6854, 0x686654, 0x666655, 0x646456,
0x636357, 0x5F6056, 0x56574D, 0x4A4C45, 0x3E3F39, 0x31332E, 0x252722, 0x191A17,
0x0D0E0C, 0x030403, 0x040101, 0x0F0707, 0x190E0D, 0x231212, 0x2D1918, 0x371F1E,
0x402424, 0x492828, 0x4D2726, 0x502523, 0x542220, 0x571F1C, 0x5C1D19, 0x611B17,
0x671A16, 0x6D1B15, 0x751E19, 0x7D251F, 0x842A24, 0x8D312A, 0x953730, 0x9A3C35,
0xA1413A, 0xA7433C, 0xAA433B, 0xAD4139, 0xB03E36, 0xB33B33, 0xB6392F, 0xB9362D,
0xBD342A, 0xC13329, 0xC6382D, 0xCB3D32, 0xCF4237, 0xD3473B, 0xD94B41, 0xDB4F45,
0xDF5449, 0xE2574B, 0xE05349, 0xDD4F44, 0xD94B40, 0xD6463B, 0xD14136, 0xCC3C31,
0xC7382C, 0xC33429, 0xBF362B, 0xBC382F, 0xB83A31, 0xB53C34, 0xB33F37, 0xAF4139,
0xAC433B, 0xA8433C, 0xA34038, 0x9C3A33, 0x95362E, 0x8E2E28, 0x872923, 0x7E241D,
0x761E17, 0x701A13, 0x6A1B14, 0x651C17, 0x601F19, 0x5C211D, 0x57231F, 0x542623,
0x512825, 0x4C2826, 0x432421, 0x381E1C, 0x2F1917, 0x261313, 0x1C0E0E, 0x110909,
0x080303, 0x020101, 0x090A0A, 0x151717, 0x232626, 0x313434, 0x3E4142, 0x4B4E4E,
0x575A5A, 0x606464, 0x626666, 0x646969, 0x656969, 0x686D6D, 0x6B7070, 0x6F7474,
0x747979, 0x7B8080, 0x868A8B, 0x8F9393, 0x999C9C, 0xA2A5A5, 0xABADAD, 0xB2B5B5,
0xBABCBC, 0xBFC1C1, 0xC2C4C4, 0xC5C7C7, 0xC8CACA, 0xCACCCC, 0xCECFD0, 0xD1D2D2,
0xD5D7D7, 0xD9DADB, 0xDFE0E0, 0xE4E4E4, 0xE9EAEA, 0xEEEEEE, 0xF2F2F2, 0xF6F6F6,
0xF9F9F9, 0xFCFCFC, 0xFBFBFB, 0xF8F8F8, 0xF5F5F5, 0xF2F1F1, 0xEDEDED, 0xE8E8E8,
0xE3E3E3, 0xDEDEDE, 0xDBDADA, 0xD6D6D6, 0xD3D3D3, 0xD0D0D0, 0xCECECE, 0xCACACA,
0xC8C7C7, 0xC4C4C3, 0xBEBEBE, 0xB7B7B7, 0xAFAFAF, 0xA7A7A7, 0x9E9D9D, 0x969595,
0x8D8C8C, 0x848383, 0x7F7F7E, 0x7A7A79, 0x767575, 0x737271, 0x71706F, 0x6E6D6D,
0x6B6B6B, 0x686767, 0x5D5C5C, 0x505050, 0x434242, 0x363535, 0x282727, 0x191919,
0x0D0D0D, 0x030303, 0x070707, 0x101112, 0x191C1C, 0x242627, 0x2F3232, 0x3A3E3E,
0x434848, 0x4A4F50, 0x484E50, 0x464C4E, 0x434A4D, 0x41494C, 0x3E484B, 0x3C474B,
0x3B484C, 0x3F4D51, 0x48565A, 0x505F62, 0x59686C, 0x627175, 0x6B7A7E, 0x728286,
0x7A898D, 0x7F8E92, 0x7E8E92, 0x7D8E92, 0x7B8D91, 0x798C91, 0x778B91, 0x758A91,
0x748B92, 0x748C94, 0x7A9299, 0x82989F, 0x889FA5, 0x8FA5AB, 0x94AAB1, 0x9AAFB6,
0x9FB3BA, 0xA2B7BD, 0x9FB5BB, 0x9AB1B7, 0x96ACB2, 0x8FA6AC, 0x89A0A8, 0x839BA2,
0x7E969E, 0x799198, 0x789097, 0x7A9096, 0x7B9097, 0x7D9197, 0x7F9297, 0x819297,
0x829297, 0x839397, 0x7F8E92, 0x76868A, 0x6F7E82, 0x667579, 0x5D6C72, 0x556368,
0x4C5B60, 0x475559, 0x465357, 0x465256, 0x475255, 0x495256, 0x4C5457, 0x4E5558,
0x505658, 0x4F5557, 0x474C4D, 0x3D4143, 0x333637, 0x292B2C, 0x1C1E1F, 0x121314,
0x080A0A, 0x020203, 0x070707, 0x121312, 0x1E1F1E, 0x2A2B2A, 0x373837, 0x434543,
0x4D504E, 0x555856, 0x555856, 0x555A56, 0x555A57, 0x555A57, 0x565B58, 0x555C58,
0x58605C, 0x5D6561, 0x68706B, 0x717974, 0x7A827D, 0x838C86, 0x8B948F, 0x939C97,
0x9AA39F, 0xA0A9A4, 0xA1ABA6, 0xA1ACA6, 0xA1ADA7, 0xA1AFA8, 0xA1AFA9, 0xA3B1AB,
0xA4B4AC, 0xA7B7AF, 0xADBDB5, 0xB3C3BB, 0xB9C8C1, 0xBECDC5, 0xC3D2CB, 0xC7D6CF,
0xCBDAD3, 0xCEDCD6, 0xCFDCD6, 0xCBDAD3, 0xC6D6CE, 0xC1D0C9, 0xBDCDC5, 0xB8C8C1,
0xB2C3BB, 0xAEBEB6, 0xACBCB4, 0xABBAB2, 0xAAB9B1, 0xA9B7B0, 0xA9B6B0, 0xA9B5AF,
0xA8B4AF, 0xA6B1AC, 0xA1ABA7, 0x9AA49F, 0x929C97, 0x8A9590, 0x838D87, 0x7A837F,
0x717B76, 0x6B746F, 0x6A736E, 0x67706B, 0x656C68, 0x646B68, 0x646A67, 0x646967,
0x646866, 0x616562, 0x585B59, 0x4D504E, 0x424442, 0x343735, 0x272928, 0x1B1C1B,
0x0F1010,
};

#endif
  • Partager sur Facebook
  • Partager sur Twitter
http://cpp-rendering.io : Vous trouverez tout ce dont vous avez besoin sur Vulkan / OpenGL et le rendu 3D !
Anonyme
18 décembre 2010 à 23:09:44

En regardant cette vidéo, j'ai eu envie de réaliser le dessin du triangle de Pascal, et de le colorier. C'est tout simple, tout bête.

#!/usr/bin/env php
<?php
$size = 2500;
$blockSize = 1;
$n = 2;

$image = imagecreatetruecolor($size, $size);

$colors[0] = imagecolorallocate($image, 0, 0, 0);
$colors[1] = imagecolorallocate($image, 0xff, 0, 0);
$colors[2] = imagecolorallocate($image, 0, 0xff, 0);
$colors[3] = imagecolorallocate($image, 0xff, 0xff, 0);

// Create a fully transparent background
imagealphablending($image, false);
imagefilledrectangle($image, 0, 0, $size, $size,
    imagecolorallocatealpha($image, 0xff, 0xff, 0xff, 127)
);
imagealphablending($image, true);

$row = array(1);
$iMax = floor($size/$blockSize);
$x0 = $blockSize * floor($iMax / 2) - floor($blockSize / 2);
$y = 0;
for($i = 0; $i < $iMax; ++$i) {
    $newRow = array();
    $x = $x0 - floor(($i * $blockSize) / 2);
    for($j = 0; $j <= $i; ++$j) {
        if($j !== $i)
        imagefilledrectangle($image, $x, $y,
            $x+$blockSize, $y+$blockSize,
            $colors[$row[$j] % $n]);

        $x += $blockSize;
        @$newRow[$j] += $row[$j - 1] % $n;
        @$newRow[$j] += $row[$j] % $n;
    }
    $row = $newRow;
    $y += $blockSize;
}

imagealphablending($image, false);
imagesavealpha($image, true);
imagepng($image);

die;

Image utilisateurImage utilisateurImage utilisateur
Résultats pour n=2,3,4
  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2010 à 16:15:47

Citation : Artefact2

En regardant cette vidéo, j'ai eu envie de réaliser le dessin du triangle de Pascal, et de le colorier. C'est tout simple, tout bête.

Image utilisateurImage utilisateurImage utilisateur
Résultats pour n=2,3,4

C'était plus joli sur papier, pour le coup y'a un gros mélange indistinct (et laid) entre du vert et du rouge, c'est pas beau. L'effet est bien plus joli avec de plus gros « points » et moins de détails quoi. Ça pourrait être sympa que t'essayes de faire un truc dans le style de la vidée. :)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
19 décembre 2010 à 17:07:47

Bon bon, voici une version (un peu) plus jolie :

#!/usr/bin/env php
<?php
$size = 985;
$blockSize = 15;
$fatness = 3;
$n = 2;

$image = imagecreatetruecolor($size, $size);

$colors[0] = imagecolorallocate($image, 0, 0, 0);
$colors[1] = imagecolorallocate($image, 0x83, 0xc7, 0x1b);
$colors[2] = imagecolorallocate($image, 0xd9, 0x33, 0x1d);
$colors[3] = imagecolorallocate($image, 0xb5, 0x18, 0x62);

// Create a fully transparent background
imagealphablending($image, false);
imagefilledrectangle($image, 0, 0, $size, $size, 
    imagecolorallocatealpha($image, 0xff, 0xff, 0xff, 127)
);
imagealphablending($image, true);

$row = array(1);
$iMax = floor($size/$blockSize);
$x0 = $blockSize * floor($iMax / 2) - floor($blockSize / 2);
$y = 0;
for($i = 0; $i < $iMax; ++$i) {
	$newRow = array();
	$x = $x0 - floor(($i * $blockSize) / 2);
	for($j = 0; $j <= $i; ++$j) {
		if($j !== $i)
		imagefilledellipse($image, 
			floor(2*$x+$blockSize)/2, 
			floor(2*$y+$blockSize)/2,
			$blockSize + $fatness,
			$blockSize + $fatness,
			$colors[$row[$j] % $n]);

		$x += $blockSize ;
		@$newRow[$j] += $row[$j - 1] % $n;
		@$newRow[$j] += $row[$j] % $n;
	}
	$row = $newRow;
	$y += $blockSize;
}

$y = $blockSize;
for($a = 0; $a < $n; ++$a) {
	for($b = 0; $b <= $a; ++$b) {
		$x = $blockSize;
		imagefilledellipse($image, 
			$x, 
			$y,
			$blockSize + $fatness,
			$blockSize + $fatness,
			$colors[$a]);
		$x += $blockSize;
		imagestring($image, 1, $x, $y+0.5*$blockSize - 10, '+', $colors[0]);
		$x += $blockSize + 4;
		imagefilledellipse($image, 
			$x, 
			$y,
			$blockSize + $fatness,
			$blockSize + $fatness,
			$colors[$b]);
		$x += $blockSize;
		imagestring($image, 1, $x, $y+0.5*$blockSize - 10, '=', $colors[0]);
		$x += $blockSize + 4;
		imagefilledellipse($image, 
			$x, 
			$y,
			$blockSize + $fatness,
			$blockSize + $fatness,
			$colors[($a + $b) % $n]);
	
		$y += $blockSize * 2;
	}
}

imagealphablending($image, false);
imagesavealpha($image, true);
imagepng($image);

die;


Image utilisateurImage utilisateurImage utilisateur
  • Partager sur Facebook
  • Partager sur Twitter
19 décembre 2010 à 18:17:04

Très chouette cette version.
  • Partager sur Facebook
  • Partager sur Twitter
20 décembre 2010 à 10:08:27

À la base je voulais tester cairo en combinaison avec la SDL. Histoire d'avoir quelque chose à faire, j'ai implémenté la fougère de Barnsley. C'était relativement facile avec les formules trouvées sur wikipédia, par contre, cairo n'était pas franchement utile dans ce contexte. Du coup, j'ai fait une version allégée rien qu'avec la SDL que voici :

#include <time.h>
#include <SDL.h>

const int WIN_WIDTH = 600;
const int WIN_HEIGHT = 600;
int NB_ITER = 1024;
int NB_ITER2 = 512;

static void paint(void);

int main(int argc, char *argv[]) {
  SDL_Init(SDL_INIT_VIDEO);
  srand(time(NULL));

  if (argc >= 3) {
    NB_ITER = atoi(argv[1]);
    NB_ITER2 = atoi(argv[2]);
  }

  paint();

  while (1) {
    SDL_Event evt;
    SDL_WaitEvent(&evt);
    switch (evt.type) {
      case SDL_QUIT:
        SDL_Quit();
        return 0;
      default:
        break;
    }
  }
}

static void drawPixel(SDL_Surface *screen, SDL_Surface *pixel,
    double x, double y)
{
  double x0 = WIN_WIDTH / 2.0;
  double y0 = WIN_HEIGHT; /* NB: y = 0 at the top of the window */

  /* To stretch pixels all over the window */
  double w = WIN_WIDTH / 5.5;
  double h = WIN_HEIGHT / 10.5;

  SDL_Rect rect = { .x = w * x + x0, .y = y0 - h * y };
  SDL_BlitSurface(pixel, NULL, screen, &rect);
}

static int mt_rand(int min, int max) {
  return ((double)rand() / ((double)RAND_MAX + 1)) * (max - min + 1) + min;
}

static void paint() {
  SDL_Surface *screen = SDL_SetVideoMode(WIN_WIDTH, WIN_HEIGHT, 32,
      SDL_HWSURFACE | SDL_DOUBLEBUF);
  /* Set background */
  SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF));

  SDL_Surface *pixel = SDL_CreateRGBSurface(SDL_HWSURFACE,
      1, 1, 32, 0, 0, 0, 0);
  SDL_FillRect(pixel, NULL, SDL_MapRGB(screen->format, 0, 0x7F, 0));

  for (int k = 0; k < NB_ITER; k++) {
    /* The algorithm itself */
    double x = 0;
    double y = 0;
    for (int i = 0; i < NB_ITER2; i++) {
      drawPixel(screen, pixel, x, y);

      double x1, y1;
      int r = mt_rand(0, 99);
      if (r > 14) { /* prob of 85% */
        /* f2 */
        x1 = .85 * x + .04 * y;
        y1 = -.04 * x + .85 * y + 1.6;
      }
      else if (r > 7) { /* prob of 7% */
        /* f3 */
        x1 = .2 * x - .26 * y;
        y1 = .23 * x + .22 * y + 1.6;
      }
      else if (r > 0) { /* prob of 7% */
        /* f4 */
        x1 = -.15 * x + .28 * y;
        y1 = .26 * x + .24 * y + .44;
      }
      else { /* prob of 1% */
        /* f1 */
        x1 = 0;
        y1 = .16 * y;
      }

      x = x1;
      y = y1;
    }

    SDL_Flip(screen);
  }

  SDL_FreeSurface(pixel);
}


Code compilable à l'aide de la commande : gcc `sdl-config --cflags` `sdl-config --libs` -std=c99 fern.c. Le nombre d'itérations peut être fourni en paramètres.

Voici le résultat avec le nombre d'itérations par défaut (1024 * 512) :
Image utilisateur
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
16 janvier 2011 à 16:02:48

Un petit triangle de Sierpinski en Processing, histoire de "uper" le topic.
  • Partager sur Facebook
  • Partager sur Twitter
5 mars 2011 à 1:03:40

Salut,
J'ai écrit ces deux derniers jours une petite librairie pour dessiner avec une tortue, à la manière de LOGO, en Ocaml à l'aide de Graphics.

Voici le code (turtle.ml):
open Graphics


(* Maths *)

let to_rad x = x /. 180. *. atan infinity *. 2.

let round r = 
  let rr = int_of_float r in
  (if r < float_of_int (rr + 1) -. 0.5 then
    rr
  else
    (succ rr)) / 1000


(* Type cool et opérations *)

type turtle = Turtle of (float * float * float * bool)

let make x y a s = Turtle (x, y, a, s)

let (>>) m f = f m

let map f = function
  | Turtle (x, y, a, s) -> Turtle (f x y a s)

let rec simple angle =
  if angle > 180. then
    simple (angle -. 360.)
    else if angle <= -180. then
      simple (angle +. 360.)
  else
    angle


(* Manipulation de la tortue *)

let left_float angle =
  map (fun x y a s -> (x, y, simple (a +. simple angle), s))

let left angle = left_float (float_of_int angle)

let right_float angle = left_float (-. angle)

let right angle = left (- angle)

let goto_float x y (Turtle (_, _, a, s)) =
  Turtle (x *. 1000., y *. 1000., a, s)

let goto x y = goto_float (float_of_int x) (float_of_int y)

let forward_float dist = function
  | Turtle (x, y, a, s) ->
      let nx = x +. (dist *. 1000.) *. cos (to_rad a)
      and ny = y +. (dist *. 1000.) *. sin (to_rad a) in
      begin
        if s then
          begin
            moveto (round x) (round y) ;
            lineto (round nx) (round ny) ;
          end ;
        Turtle (nx, ny, a, s)
      end

let forward dist = forward_float (float_of_int dist)

let backward_float dist = forward_float (-. dist)

let backward dist = forward (- dist)

let up (Turtle (x, y, a, s)) = Turtle (x, y, a, true)

let down (Turtle (x, y, a, s)) = Turtle (x, y, a, false)

let init x y =
  let _ = open_graph (" " ^ string_of_int x ^ "x" ^ string_of_int y) in
  make 0. 0. 0. true


L'idée de base était de dessiner des arbres cool ; puisque la position est (discrètement grâce à l'opérateur (>>)) passée en argument à chaque fonction, il est simple de faire partir deux branches du même point.

Voici ce que j'ai pu obtenir (compilez avec ocamlc -o arbre graphics.cma turtle.ml arbre.ml):
Image utilisateur



arbre.ml:
open Turtle

let rec arbre taille r pos =
  if r = 0 then pos else
  let d = pos >> forward taille in
  let _ = d >> left 45 >> arbre (taille - taille / 3) (pred r) in
  d >> right 25 >> arbre (taille - taille / 5) (pred r) ;;

init 1000 600 >> goto 100 150 >> left 45 >> arbre 100 15 ;;

try let _ = read_int () in () with
  | Graphics.Graphic_failure _ -> ()


Autres essais rigolos :

koch.ml (un flocon de Koch) :
Image utilisateur



open Turtle

let rec koch taille r pos =
  if r < 1 then
    pos >>
    forward_float taille
  else
    pos >>
    koch (taille /. 3.) (pred r) >>
    left 60 >>
    koch (taille /. 3.) (pred r) >>
    right (120) >>
    koch (taille /. 3.) (pred r) >>
    left 60 >>
    koch (taille /. 3.) (pred r) ;; 

let r = 7 in
init 520 600 >>
goto 10 450 >>
koch 500. r >>
right 120 >>
koch 500. r >>
right 120 >>
koch 500. r ;;

try let _ = read_int () in ()
with
| Graphics.Graphic_failure _ -> ()


triangle.ml (un triangle de Sierpińsky)
Image utilisateur



open Turtle

let rec triangle taille r pos =
  if r < 1 then pos else
    let (a, b) = sous_triangle taille r pos in
    let _ = sous_triangle taille r a in
    let _ = sous_triangle taille r b in
    pos

and sous_triangle taille r pos =
  let coin_gauche = pos >> right 30 >> forward_float taille >> left 30 in
  let coin_droite = pos >> left 30 >> forward_float taille >> right 30 in
  let debut = coin_gauche >> left 90 >> forward_float taille >> left 150 in
  let _ = debut >> triangle (taille /. 2.) (pred r) in
  (coin_gauche, coin_droite) ;;

init 500 500 >> goto 250 450 >> right 90 >> triangle 200. 10 ;;

try let _ = read_int () in () with
  | Graphics.Graphic_failure _ -> ()


Ce dernier rendu montre les limites de la chose : les flottants (qu'on manipule forcément puisqu'on utilse la trigonométrie pour trouver les coordonnées cartésiennes à partir des coordonnées polaires) sont imprécis. Mon (mauvais) algo pour le triangle repasse certains côtés ; si on disposait d'une précision parfaite, ça ne se verrait pas ; ici, certains segments ont l'air plus gros que d'autres et c'est moche.

Voilà, un petit bonus, les triangles rigolos que j'ai obtenus à cause de bugs idiots : le premier et le second.
  • Partager sur Facebook
  • Partager sur Twitter
5 mars 2011 à 10:00:33

Citation : maeln

Un petit triangle de Sierpinski en Processing, histoire de "uper" le topic.



float h1 = (x1+x2)/2.0;
    float w1 = (y1+y2)/2.0;
    float h2 = (x2+x3)/2.0;
    float w2 = (y2+y3)/2.0;
    float h3 = (x3+x1)/2.0;
    float w3 = (y3+y1)/2.0;


Il faudrait factoriser ça, et ensuite essayer avec des valeurs différentes de 2.


Krnkktz > l'idée et le code sont sympa. Je pense que tu pourrais améliorer le rendu en passant de Graphics (qui est bien pour expérimenter mais moins bien pour les rends impecs) à un autre mode de rendu, comme Cairo ou PostScript.
  • Partager sur Facebook
  • Partager sur Twitter
9 mars 2011 à 20:53:06

Bonjour a tous,
je viens poster ici un projet un peu particulier, en effet c'est un clip vidéo généré par des algorithmes mathématiques.
Vous pouvez voir la vidéo ici !
Techniquement, ces images sont générées par du raytracing sur des surfaces procedurales décrites mathématiquement par leur équation de "distance par rapport au point".
Cette technique s'appelle le sphere tracing ou encore le raytracing par distance field.
Il y a quelques docs clés sur le net a propos de cet algo : Rendering world in two polygon ainsi que RayMarching and DistanceFields : a story of SphereTracing.
  • Partager sur Facebook
  • Partager sur Twitter
9 mars 2011 à 23:46:48

Vraiment joli !

T'as codé ça en quoi ? C++ & GLSL/HLSL ?

(Des petites reprises de Ergon et de Retrospection non ? ;) )
  • Partager sur Facebook
  • Partager sur Twitter
Découvrez un petit jeu Android bien sympa : http://www.siteduzero.com/forum/sujet/appli-jeu-android-cube-racer
9 mars 2011 à 23:51:11

Hoo un connaisseur :D !
Codé 100% en GLSL avec un éditeur un peu particulier que l'on est en train de créer =) !
  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2011 à 22:51:08

Sujet mort ? Quel dommage c'était intéressant lol
Je crois que je vais essayer de m'y mettre avec la SFML ^^
  • Partager sur Facebook
  • Partager sur Twitter
24 mai 2011 à 21:02:08

Boarf, c'est plus ou moins mort depuis un p'tit bout de temps !
Les gens postent des trucs quand ils ont des trucs à montrer, mais ça devient rare ^^
  • Partager sur Facebook
  • Partager sur Twitter
Découvrez un petit jeu Android bien sympa : http://www.siteduzero.com/forum/sujet/appli-jeu-android-cube-racer
25 mai 2011 à 23:22:03

J'ai un truc à montrer ! Image utilisateur

Chaque pixel est plus ou moins grisé en fonction du nombre d'étapes que prend l'algorithme d'Euclide (que tout le monde a vu au collège il me semble) pour calculer le PGCD des coordonnées. Ce qui est cool, c'est qu'on s'apperçoit que les coordonnées des nouveaux maximums forment la suite de fibonacci. On voit aussi l'axe de symétrie de l'image (c'est normal, pgcd(a, b) c'est la même chose que le pgcd(b, a)), et jcrois que y'a encore plein de trucs à voir dedans mais j'ai dormi pendant le reste de la conférence que j'ai vue qui en parlait alors je vous invite à vous renseigner :'

#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>

#define HAUTEUR 600
#define LARGEUR 1024
#define HAUTEUR_CARRE 1
#define LARGEUR_CARRE 1
#define MAX_ETAPES 13

void draw_point(int, int);
int euclide(int, int, int);
void pause(void);

SDL_Surface *screen;

int max = 0;

void
draw_point(int a, int b)
{
        SDL_Rect pos;
        int e = euclide(a, b, 1), r;

        if (e > max) {
                max = e;
                printf("Nouveau maximum au point (%d, %d) : %d\n", a, b, e);
        }

        r = 256 - 256 * e / MAX_ETAPES;
        pos.x = LARGEUR_CARRE * a;
        pos.y = HAUTEUR_CARRE * b;
        pos.h = LARGEUR_CARRE;
        pos.w = HAUTEUR_CARRE;

        SDL_FillRect(screen, &pos,
                        SDL_MapRGB(screen->format,
                                r,
                                r,
                                r));
}

int euclide(int a, int b, int n)
{
        int r = a % b;
        if (r == 0)
                return n;
        else
                return euclide(b, r, ++n);
}

void pause(void)
{
        SDL_Event event;

        while (1) {
                SDL_WaitEvent(&event);
                if (event.type == SDL_QUIT)
                        break;
        }
}

int main(void)
{
        int i, j;

        if (SDL_Init(SDL_INIT_VIDEO) == -1) {
                fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError());
                exit(EXIT_FAILURE);
        }

        screen = SDL_SetVideoMode(LARGEUR, HAUTEUR, 32, SDL_RESIZABLE);

        for (i = 1; i <= LARGEUR / LARGEUR_CARRE; ++i) {
                for (j = 1; j <= HAUTEUR / HAUTEUR_CARRE; ++j) {
                        draw_point(i, j);
                }
                SDL_Flip(screen);
        }

        pause();

        SDL_Quit();

        return EXIT_SUCCESS;
}


La bonne nouvelle, c'est qu'on peut zoomer en changeant les defines :)
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
1 août 2011 à 17:36:35

Un petit UP, pour un topic qui le vaut bien ?
  • Partager sur Facebook
  • Partager sur Twitter
15 août 2011 à 17:12:40

Bonjour,

Un truc qui n'est pas de moi, mais je le mets car ca me semble tres interessant :

http://graphism.fr/comment-visualiser- [...] e-le-regarder

ps: il faut absolument voir la video
  • Partager sur Facebook
  • Partager sur Twitter
29 août 2011 à 14:29:25

Salut,

Pas vraiment très original, mais je me suis amusé à dessiner l’ensemble de Mandelbrot, en GLSL (avec du Ruby, mais le vrai travail est effectué du côté du shader). Ici, les points qui font partie de la fractale sont dessinés normalement, et la couleur des autres est inversées, avec un dégradé pour faire plus joli. J’ai commencé simplement par dessiner un rectangle noir.

require 'ray'

ImageWidth  = 640
ImageHeight = 480

image = Ray::Image.new [ImageWidth, ImageHeight]

Ray::ImageTarget.new image do |target|
  target.shader.compile(:frag => StringIO.new(<<eof))
#version 130

const int max_it = 50;

const float width  = #{ImageWidth.to_f};
const float height = #{ImageHeight.to_f};

in  vec4 var_Color;
out vec4 out_FragColor;

vec2 mandelbrot_pos() {
 return vec2((gl_FragCoord.x / width) * 2.7 - 2.1,
             (gl_FragCoord.y / height) * 2.4 - 1.2);
}

vec2 complex_square(vec2 complex) {
  return vec2(complex.x * complex.x - complex.y * complex.y,
              2.0 * complex.x * complex.y);
}

vec4 inverse(vec4 color, int i) {
  return vec4((vec3(1.0, 1.0, 1.0) - color.rgb) / float(i + 1), color.a);
}

void main() {
  vec2 c = mandelbrot_pos();
  vec2 z = vec2(0.0, 0.0);

  int i = 0;

  for (i = 0; i < max_it; i++) {
    z = complex_square(z) + c;
    if (dot(z, z) > 4.0) break;
  }

  out_FragColor = i == max_it ? var_Color : inverse(var_Color, i);
}
eof

  target.draw Ray::Polygon.rectangle([0, 0, ImageWidth, ImageHeight], Ray::Color.black)

  target.update
end

Ray.game "Mandelbrot", :size => image.size do
  register { add_hook :quit, method(:exit!) }

  scene :mandelbrot do
    @sprite = sprite(image)

    render do |win|
      win.draw @sprite
    end
  end

  scenes << :mandelbrot
end


Résultat

Après, j’ai essayé avec des couleurs aléatoires, en changeant un peu le code du dessin :

rect = Ray::Polygon.rectangle([0, 0, ImageWidth, ImageHeight])
rect.each { |p| p.color = Ray::Color.new(rand(256), rand(256), rand(256)) }

target.draw rect


Résultat

Et comme je ne suis pas limité au dessin de rectangles, j’ai essayé de rajouter des cercles par dessus :
20.times do
  target.draw Ray::Polygon.circle([rand(ImageWidth), rand(ImageHeight)],
                                  rand(20) + 10,
                                  Ray::Color.new(rand(256), rand(256), rand(256)))
end

Résultat

On peut même aller plus loin et utiliser une texture en changeant un peu le shader :
require 'ray'

ImageWidth  = 1920
ImageHeight = 1080

image = Ray::Image.new [ImageWidth, ImageHeight]

Ray::ImageTarget.new image do |target|
  target.shader.compile(:frag => StringIO.new(<<eof))
#version 130

const int max_it = 50;

const float width  = #{ImageWidth.to_f};
const float height = #{ImageHeight.to_f};

uniform sampler2D in_Texture;

in vec4 var_Color;
in vec2 var_TexCoord;

out vec4 out_FragColor;

vec2 mandelbrot_pos() {
  return vec2((gl_FragCoord.x / width) * 2.7 - 2.1,
              (gl_FragCoord.y / height) * 2.4 - 1.2);
}

vec2 complex_square(vec2 complex) {
  return vec2(complex.x * complex.x - complex.y * complex.y,
              2.0 * complex.x * complex.y);
}

vec4 inverse(vec4 color, int i) {
  return vec4((vec3(1.0, 1.0, 1.0) - color.rgb) / float(i + 1), color.a);
}

void main() {
  vec2 c = mandelbrot_pos();
  vec2 z = vec2(0.0, 0.0);

  int i = 0;

  for (i = 0; i < max_it; i++) {
    z = complex_square(z) + c;
    if (dot(z, z) > 4.0) break;
  }

  vec4 color = var_Color * texture(in_Texture, var_TexCoord);
  out_FragColor = i == max_it ? color : inverse(color, i);
}
eof

  target.draw Ray::Sprite.new("pattern.png")

  target.update
end

Ray.game "Mandelbrot", :size => image.size do
  register { add_hook :quit, method(:exit!) }

  scene :mandelbrot do
    @sprite = sprite(image)

    render do |win|
      win.draw @sprite
    end
  end

  scenes << :mandelbrot
end


Résultat
  • Partager sur Facebook
  • Partager sur Twitter
22 septembre 2011 à 7:47:49

Han ! J'avais jamais vu ce topic... Je m'étais intéressé à une époque à ce genre de problèmes, et avait fait quelques réalisations, mais j'ai abandonné par manque de temps et de motivation.

C'est l'occasion idéale pour s'y remettre. En tout cas, félicitation pour l'ensemble des travaux, qui sont très beaux pour la plupart.
  • Partager sur Facebook
  • Partager sur Twitter
Small is Beautiful — E.F. Schumacher | Blog (fr)
22 septembre 2011 à 9:27:07

Oh je n'avais jamais vu ce topic !! Merveilleux les screenshots des fractales et autres rendus mathématiques :)

Je voulais reprendre un post, ou il y a un labyrinthe 3D.

Citation : Yannshu

Et pour finir, un petit labyrinthe en 3 dimensions.

Petite explication pour le labyrinthe, les boudins en forme de cube representent le chemin entre le cube vert et le cube rouge.
Le cube vert et le cube rouge sont diagonalement positionnes. Il n'y a qu'un seul chemin entre ces deux cubes.

Image utilisateur



Mon vieux projet Klostro Laby est exactement la même chose, mais vu de l'intérieur :)
Image utilisateur
  • Partager sur Facebook
  • Partager sur Twitter

Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html