|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
SQUELETTE DE MOTEUR 3D
Information sur la source
Description
Jusque de quoi faire un moteur 3d: - environnement de base : 5*5*5 points, on va dire que c'est une map de démonstration - une base globale et une base caméra - reception des messages du clavier (via l'API Winodws) - traitement des messages => déplacement dans l'environnement Pour les solutions techniques utilisées : juste la multiplication de matrices. Juste un point pas évident : les matrices sont 4*4 alors que on évolue dans un environnement 3*3. Pouquoi donc ? Parce que cela nous permet de nous situer dans un "espace homogène" (je crois que ça s'appelle comme ça). En gros, la translation, très utilisée par le moteur 3d n'est pas une application linéaire (l'image de l'origine n'est pas l'origine par exemple), donc on ne pas utliliser les matrices, qui sont pourtant très pratiques. Mais on peut se débrouiller en rajoutant une dimention, car une application linéaire dans l'espace homogène peut se retrouver être une translation dans un espace de cet espace homogène (typiquement l'espace w=1 mais tous les espaces qui ne contiennent pas l'origine à mon avis). Génial, non ? Sinon, il vaut mieux essayer à comprendre avec un plan, c'est plus facile.
Source
- // Moteur3D - Mon moteur 3D
- // Commandé au clavier par les touches flèchées et par les touches z, q, s, d, CapsLock, Ctrl, Insert, f.
- // Traite les messages signalant l'appui d'une touche.
-
- #include <windows.h>
- #include <math.h>
-
- /********************************* DEFINITIONS ********************************/
- #define X 0
- #define Y 1
- #define Z 2
-
- /***************************** VARIABLES UTILISEES ****************************/
-
- HINSTANCE hInstance; // Handle du programme
-
- double distance_ecran = 600; // Distance des yeux à l'écran (mm).
- double largeur_ecran_metrique = 375; // En mm.
- double hauteur_ecran_metrique = 300; // En mm.
- double largeur_ecran_pixel = 1280; // En pixels.
- double hauteur_ecran_pixel = 1024; // En pixels.
- double matrice_globale_camera [16]= { // Matrice de changement de base : base globale -> base camera
- 1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1}; // matrice identité
- double coefficient_translation = 1; // Longueur de la translation élementaire (appui d'une touche) en mm
- double coefficient_rotation = 10; // Angle d'une rotation élementaire (appui d'une touche) en 10^-3 rad
- double grille [5*5*5*4]; // Plus tard, une grille de 5 * 5 * 5 points
-
- // Callback
- LRESULT CALLBACK WindowMainProcedure (HWND, UINT, WPARAM, LPARAM);
-
- // Traitement et affichage de l'image.
- void ImageTraitement (HWND hwnd);
-
- // Translate la base caméra (pour faire une nouvelle base caméra)
- void TranslationCamera (long axe, double longueur);
-
- // Rotationne la base caméra (pour faire une nouvelle base caméra)
- void RotationCamera (long axe, double angle);
-
- // Multiplie une matrice 1*4 par une matrice 4*4.
- void MatriceMultiplication_14_44 (double matrice_1 [4], double matrice_2 [16], double matrice_s [4]);
-
- // Multiplie une matrice 4*4 par une matrice 4*4.
- void MatriceMultiplication_44_44 (double matrice_1 [16], double matrice_2 [16], double matrice_s [16]);
-
-
- /********************************** FONCTIONS *********************************/
-
- int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
- {
- MSG messages;
- WNDCLASSEX wincl;
- HWND hwnd;
-
- hInstance = hThisInstance;
-
- wincl.cbSize = sizeof (WNDCLASSEX);
- wincl.style = CS_HREDRAW | CS_VREDRAW;
- wincl.lpfnWndProc = WindowMainProcedure;
- wincl.cbClsExtra = 0;
- wincl.cbWndExtra = 0;
- wincl.hInstance = hInstance;
- wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
- wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
- wincl.hbrBackground = GetStockObject (BLACK_BRUSH);
- wincl.lpszMenuName = NULL;
- wincl.lpszClassName = "MainClass";
- wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
-
- if (!RegisterClassEx (&wincl)){
- MessageBox (NULL, "Erreur dans l'enregistrement de la classe \"MainClass\".",
- "Erreur", MB_OK | MB_ICONWARNING);
- return 0;}
-
- hwnd = CreateWindowEx (0, "MainClass", "Moteur 3D",
- WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
- 500, 300, HWND_DESKTOP, NULL, hInstance, NULL);
-
- if (!hwnd){
- MessageBox (NULL, "Erreur dans la création de la fenêtre.",
- "Erreur", MB_OK | MB_ICONWARNING);
- return 0;}
-
- while (GetMessage (&messages, NULL, 0, 0))
- {
- DispatchMessage(&messages);
- }
-
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpszArgument);
- UNREFERENCED_PARAMETER(nFunsterStil);
- return messages.wParam;
- }
-
-
-
-
- LRESULT CALLBACK WindowMainProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- switch (message) {
- case WM_CREATE:
- {
- long i, j, k;
- // Initialisation des points.
- for (i=0; i<5; i++){
- for (j=0; j<5; j++){
- for (k=0; k<5; k++){
- grille [i*5*5*4 + j*5*4 + k*4] = 5 * i;
- grille [i*5*5*4 + j*5*4 + k*4 + 1] = 5 * j;
- grille [i*5*5*4 + j*5*4 + k*4 + 2] = 100 + (5 * k);// Calcul des coordonnées
- grille [i*5*5*4 + j*5*4 + k*4 + 3] = 1; // Tous ces points appatiennent à l'espace de
- // coordonnée w=1 dans l'espace homogène (on rajoute cette 4ème dimention pour utiliser les
- // propriétés d'une application linéaire avec la translation (application non linéaire))
- }
- }
- }
- }
- return 0;
-
- case WM_KEYDOWN:
- {
- BOOL modif = FALSE;
-
- switch (wParam){
- // translations avec les touche fléchées et Ctrl et Insert
- case VK_LEFT:
- TranslationCamera (X, lParam & 0xFFFF);
- modif = TRUE;
- break;
-
- case VK_RIGHT:
- TranslationCamera (X, -(lParam & 0xFFFF));
- modif = TRUE;
- break;
-
- case VK_UP:
- TranslationCamera (Y, -(lParam & 0xFFFF));
- modif = TRUE;
- break;
-
- case VK_DOWN:
- TranslationCamera (Y, lParam & 0xFFFF);
- modif = TRUE;
- break;
-
- case VK_CONTROL:
- TranslationCamera (Z, lParam & 0xFFFF);
- modif = TRUE;
- break;
-
- case VK_NUMPAD0:
- TranslationCamera (Z, -(lParam & 0xFFFF));
- modif = TRUE;
- break;
-
- // rotations avec q, d, z, s, CapsLock et f
- case 'Q':
- RotationCamera (Y, lParam & 0xFFFF);
- modif = TRUE;
- break;
-
- case 'D':
- RotationCamera (Y, -(lParam & 0xFFFF));
- modif = TRUE;
- break;
-
- case 'Z':
- RotationCamera (X, lParam & 0xFFFF);
- modif = TRUE;
- break;
-
- case 'S':
- RotationCamera (X, -(lParam & 0xFFFF));
- modif = TRUE;
- break;
-
- case VK_CAPITAL:
- RotationCamera (Z, lParam & 0xFFFF);
- modif = TRUE;
- break;
-
- case 'F':
- RotationCamera (Z, -(lParam & 0xFFFF));
- modif = TRUE;
- break;
- }
-
- if (modif == TRUE){
- // Demande à redessiner l'image.
- InvalidateRect (hwnd, NULL, TRUE);
- }
- }
- return 0;
-
-
- case WM_PAINT:
- ImageTraitement (hwnd);
- return 0;
-
- case WM_DESTROY:
- PostQuitMessage (0);
- break;
-
- default:
- return DefWindowProc (hwnd, message, wParam, lParam);
- }
-
- return 0;
- }
-
-
-
-
- void ImageTraitement (HWND hwnd)
- {
- HDC hdc;
- PAINTSTRUCT ps;
- RECT ClientRect;
- long i;
- double coord_3d [4];
- double coord_2d [2];
-
- GetClientRect (hwnd, &ClientRect);
-
- hdc = BeginPaint (hwnd, &ps);
- // Traitement des points un par un.
- for (i=0; i<5*5*5; i++){
- // Calcule les coordonnées du point dans la base caméra.
- MatriceMultiplication_14_44 (grille + (i*4), matrice_globale_camera, coord_3d);
-
- if (coord_3d [2] > 0){
- // Calcule les coordonnées dans le plan vituel (en mm).
- coord_2d [0] = distance_ecran * (coord_3d [0] / coord_3d [2]);
- coord_2d [1] = distance_ecran * (coord_3d [1] / coord_3d [2]);
-
- // Calcule les coordonnées dans le plan réel (en pixel)
- coord_2d [0] *= largeur_ecran_pixel / largeur_ecran_metrique;
- coord_2d [1] *= hauteur_ecran_pixel / hauteur_ecran_metrique;
-
- // Centre les cordonnées
- coord_2d [0] += ClientRect.right / 2;
- coord_2d [1] = (ClientRect.bottom / 2) - coord_2d [1];
-
- // Affiche le point
- SetPixel (hdc, (long)(coord_2d [0]), (long)(coord_2d [1]), 0x00FFFFFF);
- }
- }
- EndPaint (hwnd, &ps);
- }
-
-
- void TranslationCamera (long axe, double longueur)
- {
- double matrice_translation [16]= {
- 1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1}; // matrice identité
- double matrice_tampon [16];
- long i;
-
- // Calcule la matrice de translation
- matrice_translation [(axe * 4) + 3] = longueur * coefficient_translation;
-
- // Effectue la translation
- MatriceMultiplication_44_44 (matrice_globale_camera, matrice_translation, matrice_tampon);
-
- // Remplace la matrice de changement de base
- for (i=0; i<16; i++){
- matrice_globale_camera [i] = matrice_tampon [i];}
- }
-
-
- void RotationCamera (long axe, double angle)
- {
- double matrice_rotation [16]= {
- 1, 0, 0, 0,
- 0, 1, 0, 0,
- 0, 0, 1, 0,
- 0, 0, 0, 1}; // matrice identité
- double matrice_tampon [16];
- double sinus, cosinus;
- long i;
-
- // Calcule la matrice de rotation
- sinus = sin (angle * coefficient_rotation / 1000);
- cosinus = cos (angle * coefficient_rotation / 1000);
- switch (axe) {
- case X:
- matrice_rotation [5] = matrice_rotation [10] = cosinus;
- // i = (0; 1; 0); j = (0; 0; 1)
- matrice_rotation [6] = -sinus;
- matrice_rotation [9] = sinus;
- break;
-
- case Y:
- matrice_rotation [0] = matrice_rotation [10] = cosinus;
- // i = (0; 0; 1); j = (1; 0; 0)
- matrice_rotation [8] = -sinus;
- matrice_rotation [2] = sinus;
- break;
-
- case Z:
- matrice_rotation [0] = matrice_rotation [5] = cosinus;
- // i = (1; 0; 0); j = (0; 1; 0)
- matrice_rotation [1] = -sinus;
- matrice_rotation [4] = sinus;
- break;
- }
-
- // Effectue la rotation
- MatriceMultiplication_44_44 (matrice_globale_camera, matrice_rotation, matrice_tampon);
-
- // Remplace la matrice de changement de base
- for (i=0; i<16; i++){
- matrice_globale_camera [i] = matrice_tampon [i];}
- }
-
-
- void MatriceMultiplication_14_44 (double matrice_1 [4], double matrice_2 [16], double matrice_s [4])
- {
- matrice_s [0] =
- (matrice_1 [0] * matrice_2 [0]) +
- (matrice_1 [1] * matrice_2 [1]) +
- (matrice_1 [2] * matrice_2 [2]) +
- (matrice_1 [3] * matrice_2 [3]);
- matrice_s [1] =
- (matrice_1 [0] * matrice_2 [4]) +
- (matrice_1 [1] * matrice_2 [5]) +
- (matrice_1 [2] * matrice_2 [6]) +
- (matrice_1 [3] * matrice_2 [7]);
- matrice_s [2] =
- (matrice_1 [0] * matrice_2 [8]) +
- (matrice_1 [1] * matrice_2 [9]) +
- (matrice_1 [2] * matrice_2 [10]) +
- (matrice_1 [3] * matrice_2 [11]);
- matrice_s [3] =
- (matrice_1 [0] * matrice_2 [12]) +
- (matrice_1 [1] * matrice_2 [13]) +
- (matrice_1 [2] * matrice_2 [14]) +
- (matrice_1 [3] * matrice_2 [15]);
- }
-
-
- void MatriceMultiplication_44_44 (double matrice_1 [16], double matrice_2 [16], double matrice_s [16])
- {
- long i, j;
-
- for (j=0; j<16; j+=4){
- for (i=0; i<4; i++){
- matrice_s [j + i] =
- (matrice_1 [i] * matrice_2 [j]) +
- (matrice_1 [i + 4] * matrice_2 [j + 1]) +
- (matrice_1 [i + 8] * matrice_2 [j + 2]) +
- (matrice_1 [i + 12] * matrice_2 [j + 3]);
- }
- }
- }
// Moteur3D - Mon moteur 3D
// Commandé au clavier par les touches flèchées et par les touches z, q, s, d, CapsLock, Ctrl, Insert, f.
// Traite les messages signalant l'appui d'une touche.
#include <windows.h>
#include <math.h>
/********************************* DEFINITIONS ********************************/
#define X 0
#define Y 1
#define Z 2
/***************************** VARIABLES UTILISEES ****************************/
HINSTANCE hInstance; // Handle du programme
double distance_ecran = 600; // Distance des yeux à l'écran (mm).
double largeur_ecran_metrique = 375; // En mm.
double hauteur_ecran_metrique = 300; // En mm.
double largeur_ecran_pixel = 1280; // En pixels.
double hauteur_ecran_pixel = 1024; // En pixels.
double matrice_globale_camera [16]= { // Matrice de changement de base : base globale -> base camera
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1}; // matrice identité
double coefficient_translation = 1; // Longueur de la translation élementaire (appui d'une touche) en mm
double coefficient_rotation = 10; // Angle d'une rotation élementaire (appui d'une touche) en 10^-3 rad
double grille [5*5*5*4]; // Plus tard, une grille de 5 * 5 * 5 points
// Callback
LRESULT CALLBACK WindowMainProcedure (HWND, UINT, WPARAM, LPARAM);
// Traitement et affichage de l'image.
void ImageTraitement (HWND hwnd);
// Translate la base caméra (pour faire une nouvelle base caméra)
void TranslationCamera (long axe, double longueur);
// Rotationne la base caméra (pour faire une nouvelle base caméra)
void RotationCamera (long axe, double angle);
// Multiplie une matrice 1*4 par une matrice 4*4.
void MatriceMultiplication_14_44 (double matrice_1 [4], double matrice_2 [16], double matrice_s [4]);
// Multiplie une matrice 4*4 par une matrice 4*4.
void MatriceMultiplication_44_44 (double matrice_1 [16], double matrice_2 [16], double matrice_s [16]);
/********************************** FONCTIONS *********************************/
int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil)
{
MSG messages;
WNDCLASSEX wincl;
HWND hwnd;
hInstance = hThisInstance;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.style = CS_HREDRAW | CS_VREDRAW;
wincl.lpfnWndProc = WindowMainProcedure;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hInstance = hInstance;
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.hbrBackground = GetStockObject (BLACK_BRUSH);
wincl.lpszMenuName = NULL;
wincl.lpszClassName = "MainClass";
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
if (!RegisterClassEx (&wincl)){
MessageBox (NULL, "Erreur dans l'enregistrement de la classe \"MainClass\".",
"Erreur", MB_OK | MB_ICONWARNING);
return 0;}
hwnd = CreateWindowEx (0, "MainClass", "Moteur 3D",
WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT,
500, 300, HWND_DESKTOP, NULL, hInstance, NULL);
if (!hwnd){
MessageBox (NULL, "Erreur dans la création de la fenêtre.",
"Erreur", MB_OK | MB_ICONWARNING);
return 0;}
while (GetMessage (&messages, NULL, 0, 0))
{
DispatchMessage(&messages);
}
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpszArgument);
UNREFERENCED_PARAMETER(nFunsterStil);
return messages.wParam;
}
LRESULT CALLBACK WindowMainProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_CREATE:
{
long i, j, k;
// Initialisation des points.
for (i=0; i<5; i++){
for (j=0; j<5; j++){
for (k=0; k<5; k++){
grille [i*5*5*4 + j*5*4 + k*4] = 5 * i;
grille [i*5*5*4 + j*5*4 + k*4 + 1] = 5 * j;
grille [i*5*5*4 + j*5*4 + k*4 + 2] = 100 + (5 * k);// Calcul des coordonnées
grille [i*5*5*4 + j*5*4 + k*4 + 3] = 1; // Tous ces points appatiennent à l'espace de
// coordonnée w=1 dans l'espace homogène (on rajoute cette 4ème dimention pour utiliser les
// propriétés d'une application linéaire avec la translation (application non linéaire))
}
}
}
}
return 0;
case WM_KEYDOWN:
{
BOOL modif = FALSE;
switch (wParam){
// translations avec les touche fléchées et Ctrl et Insert
case VK_LEFT:
TranslationCamera (X, lParam & 0xFFFF);
modif = TRUE;
break;
case VK_RIGHT:
TranslationCamera (X, -(lParam & 0xFFFF));
modif = TRUE;
break;
case VK_UP:
TranslationCamera (Y, -(lParam & 0xFFFF));
modif = TRUE;
break;
case VK_DOWN:
TranslationCamera (Y, lParam & 0xFFFF);
modif = TRUE;
break;
case VK_CONTROL:
TranslationCamera (Z, lParam & 0xFFFF);
modif = TRUE;
break;
case VK_NUMPAD0:
TranslationCamera (Z, -(lParam & 0xFFFF));
modif = TRUE;
break;
// rotations avec q, d, z, s, CapsLock et f
case 'Q':
RotationCamera (Y, lParam & 0xFFFF);
modif = TRUE;
break;
case 'D':
RotationCamera (Y, -(lParam & 0xFFFF));
modif = TRUE;
break;
case 'Z':
RotationCamera (X, lParam & 0xFFFF);
modif = TRUE;
break;
case 'S':
RotationCamera (X, -(lParam & 0xFFFF));
modif = TRUE;
break;
case VK_CAPITAL:
RotationCamera (Z, lParam & 0xFFFF);
modif = TRUE;
break;
case 'F':
RotationCamera (Z, -(lParam & 0xFFFF));
modif = TRUE;
break;
}
if (modif == TRUE){
// Demande à redessiner l'image.
InvalidateRect (hwnd, NULL, TRUE);
}
}
return 0;
case WM_PAINT:
ImageTraitement (hwnd);
return 0;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}
return 0;
}
void ImageTraitement (HWND hwnd)
{
HDC hdc;
PAINTSTRUCT ps;
RECT ClientRect;
long i;
double coord_3d [4];
double coord_2d [2];
GetClientRect (hwnd, &ClientRect);
hdc = BeginPaint (hwnd, &ps);
// Traitement des points un par un.
for (i=0; i<5*5*5; i++){
// Calcule les coordonnées du point dans la base caméra.
MatriceMultiplication_14_44 (grille + (i*4), matrice_globale_camera, coord_3d);
if (coord_3d [2] > 0){
// Calcule les coordonnées dans le plan vituel (en mm).
coord_2d [0] = distance_ecran * (coord_3d [0] / coord_3d [2]);
coord_2d [1] = distance_ecran * (coord_3d [1] / coord_3d [2]);
// Calcule les coordonnées dans le plan réel (en pixel)
coord_2d [0] *= largeur_ecran_pixel / largeur_ecran_metrique;
coord_2d [1] *= hauteur_ecran_pixel / hauteur_ecran_metrique;
// Centre les cordonnées
coord_2d [0] += ClientRect.right / 2;
coord_2d [1] = (ClientRect.bottom / 2) - coord_2d [1];
// Affiche le point
SetPixel (hdc, (long)(coord_2d [0]), (long)(coord_2d [1]), 0x00FFFFFF);
}
}
EndPaint (hwnd, &ps);
}
void TranslationCamera (long axe, double longueur)
{
double matrice_translation [16]= {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1}; // matrice identité
double matrice_tampon [16];
long i;
// Calcule la matrice de translation
matrice_translation [(axe * 4) + 3] = longueur * coefficient_translation;
// Effectue la translation
MatriceMultiplication_44_44 (matrice_globale_camera, matrice_translation, matrice_tampon);
// Remplace la matrice de changement de base
for (i=0; i<16; i++){
matrice_globale_camera [i] = matrice_tampon [i];}
}
void RotationCamera (long axe, double angle)
{
double matrice_rotation [16]= {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1}; // matrice identité
double matrice_tampon [16];
double sinus, cosinus;
long i;
// Calcule la matrice de rotation
sinus = sin (angle * coefficient_rotation / 1000);
cosinus = cos (angle * coefficient_rotation / 1000);
switch (axe) {
case X:
matrice_rotation [5] = matrice_rotation [10] = cosinus;
// i = (0; 1; 0); j = (0; 0; 1)
matrice_rotation [6] = -sinus;
matrice_rotation [9] = sinus;
break;
case Y:
matrice_rotation [0] = matrice_rotation [10] = cosinus;
// i = (0; 0; 1); j = (1; 0; 0)
matrice_rotation [8] = -sinus;
matrice_rotation [2] = sinus;
break;
case Z:
matrice_rotation [0] = matrice_rotation [5] = cosinus;
// i = (1; 0; 0); j = (0; 1; 0)
matrice_rotation [1] = -sinus;
matrice_rotation [4] = sinus;
break;
}
// Effectue la rotation
MatriceMultiplication_44_44 (matrice_globale_camera, matrice_rotation, matrice_tampon);
// Remplace la matrice de changement de base
for (i=0; i<16; i++){
matrice_globale_camera [i] = matrice_tampon [i];}
}
void MatriceMultiplication_14_44 (double matrice_1 [4], double matrice_2 [16], double matrice_s [4])
{
matrice_s [0] =
(matrice_1 [0] * matrice_2 [0]) +
(matrice_1 [1] * matrice_2 [1]) +
(matrice_1 [2] * matrice_2 [2]) +
(matrice_1 [3] * matrice_2 [3]);
matrice_s [1] =
(matrice_1 [0] * matrice_2 [4]) +
(matrice_1 [1] * matrice_2 [5]) +
(matrice_1 [2] * matrice_2 [6]) +
(matrice_1 [3] * matrice_2 [7]);
matrice_s [2] =
(matrice_1 [0] * matrice_2 [8]) +
(matrice_1 [1] * matrice_2 [9]) +
(matrice_1 [2] * matrice_2 [10]) +
(matrice_1 [3] * matrice_2 [11]);
matrice_s [3] =
(matrice_1 [0] * matrice_2 [12]) +
(matrice_1 [1] * matrice_2 [13]) +
(matrice_1 [2] * matrice_2 [14]) +
(matrice_1 [3] * matrice_2 [15]);
}
void MatriceMultiplication_44_44 (double matrice_1 [16], double matrice_2 [16], double matrice_s [16])
{
long i, j;
for (j=0; j<16; j+=4){
for (i=0; i<4; i++){
matrice_s [j + i] =
(matrice_1 [i] * matrice_2 [j]) +
(matrice_1 [i + 4] * matrice_2 [j + 1]) +
(matrice_1 [i + 8] * matrice_2 [j + 2]) +
(matrice_1 [i + 12] * matrice_2 [j + 3]);
}
}
}
Conclusion
Si j'ai le temps, j'essairai de l'améliorer en mettant du multithreading, en utilisant la souris, ... j'attend aussi vos remarques.
Fichier Zip
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
Télécharger le zip
Historique
- 11 novembre 2007 23:52:18 :
- Faute d'orthographe; remise en forme.
- 11 novembre 2007 23:55:49 :
- Correction de fautes d'orthographe; remise en forme
Sources du même auteur
Sources de la même categorie
Sources en rapport avec celle ci
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Problème pour dériver une classe [ par arc59 ]
J'ai créé une classe Matrice comportant des fonctions get_ele, set_ele (toutes les 2 sont "virtual") et la redéfinition de l'opérateur +.Dans ma class
fichier.h [ par bidules ]
Bonjour,j'aimerais savoir s'il est possible de mettre des structures dans un fichier d'entete.Car j'ai fais l'essai mais lors de la compilation pour c
PB de matrice [ par limax84 ]
J'ai un probleme d'allocation dynamique de memoire pour une matrice.pour un tableau, je procede comme ceci:int * t;t = new int [30];mais pour une matr
matrice carréé [ par justeroland ]
j'ai besoin de l'aide au sujet de l'exercice suivant: une matrice carré est dite balancée si les sommes des elements de ses quatre triangles sont égal
Besoin d'aide en C - Fonction [ par bugs2600 ]
Voici mon programme quelqu'un pourrait-il m'aider je dois faire une fonction et je ne vois pas comment la faire le non de ma fonction doit etre PRODMA
graphisme ms-dos en c avec dev-cpp [ par surfeurnet ]
Salut,Je suis débutant en c et je voudrai faire des graphiques sous ms-dos avec dev-cpp comment puis-je faire (j'ai entendue parlez de l'utilisation d
une matrice de taille quelconque [ par anaisa ]
salut tt le monde saurez vous m'aidez à résoudre un petit probleme: je dois programmé la somme, produit de matrices de taille quelconque en langage C
Coord 2D to 3D [ par bat67000 ]
Comment optenir d'un point 2D sur l'app les coordonnees du point 3D associé avec la matrice de projection ?(je pige pas bien comment fonctionne la mat
animer un graphisme [ par GreatNeo ]
Je crée par exemple une ligne. Est-il possible de la déplacer ? faut-il la transformer en bitmap ? (si oui quelle est la fonction pour le faire ?)Je v
Matrice constante. [ par nsoualem ]
j'ai crée une classe matrice avec un constructeurdu type:matrice(int nbligne,int nbcolonne)...elle marche a merveille!!!Lors de la création d'un code,
|
Téléchargements
Logiciels à télécharger sur le même thème :
Comparez les prix Nouvelle version
|