FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Gestion d'un système client-serveur.
Projet d'un Rubik's cube en 3D - Page 5 Emptypar Pedro Aujourd'hui à 8:06

» Bataille terrestre
Projet d'un Rubik's cube en 3D - Page 5 Emptypar Marc Hier à 16:20

» item_index
Projet d'un Rubik's cube en 3D - Page 5 Emptypar Marc Hier à 16:13

» SineCube
Projet d'un Rubik's cube en 3D - Page 5 Emptypar Marc Sam 11 Mai 2024 - 12:38

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
Projet d'un Rubik's cube en 3D - Page 5 Emptypar Marc Sam 11 Mai 2024 - 12:22

» Philharmusique
Projet d'un Rubik's cube en 3D - Page 5 Emptypar jjn4 Ven 10 Mai 2024 - 13:58

» PANORAMIC V 1
Projet d'un Rubik's cube en 3D - Page 5 Emptypar papydall Jeu 9 Mai 2024 - 3:22

» select intégrés [résolu]
Projet d'un Rubik's cube en 3D - Page 5 Emptypar jjn4 Mer 8 Mai 2024 - 17:00

» number_mouse_up
Projet d'un Rubik's cube en 3D - Page 5 Emptypar jjn4 Mer 8 Mai 2024 - 11:59

» Aide de PANORAMIC
Projet d'un Rubik's cube en 3D - Page 5 Emptypar jjn4 Mer 8 Mai 2024 - 11:16

» trop de fichiers en cours
Projet d'un Rubik's cube en 3D - Page 5 Emptypar lepetitmarocain Mer 8 Mai 2024 - 10:43

» Je teste PANORAMIC V 1 beta 1
Projet d'un Rubik's cube en 3D - Page 5 Emptypar papydall Mer 8 Mai 2024 - 4:17

» bouton dans autre form que 0
Projet d'un Rubik's cube en 3D - Page 5 Emptypar leclode Lun 6 Mai 2024 - 13:59

» KGF_dll - nouvelles versions
Projet d'un Rubik's cube en 3D - Page 5 Emptypar Klaus Lun 6 Mai 2024 - 11:41

» @Jack
Projet d'un Rubik's cube en 3D - Page 5 Emptypar Jack Mar 30 Avr 2024 - 20:40

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Mai 2024
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
2728293031  
CalendrierCalendrier
-28%
Le deal à ne pas rater :
Précommande : Smartphone Google Pixel 8a 5G Double Sim 128Go ...
389 € 539 €
Voir le deal

 

 Projet d'un Rubik's cube en 3D

Aller en bas 
+7
mindstorm
Jack
Jean Claude
silverman
Marc
jjn4
Minibug
11 participants
Aller à la page : Précédent  1, 2, 3, 4, 5, 6, 7, 8, 9  Suivant
AuteurMessage
Marc

Marc


Nombre de messages : 2396
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyMar 4 Oct 2022 - 21:30

Minibug a écrit:
...j'ai réalisé une petite interface pour piloter les mouvements du cube...

Bravo Minibug ! Cela fonctionne bien !

Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyMar 4 Oct 2022 - 21:48

C'est surtout Silverman qu'il faut remercier !! Very Happy Very Happy

ET toi Marc ou en est ton programme ?
On attends pour avoir une autre approche, ainsi que Mindstorm...
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyMer 5 Oct 2022 - 19:16

des nouvelles du front
Pour l'instant je suis un peut noyer (quatre jours déjà) avec les transformation des coordonnées cartésienne en coordonnées sphérique
et inversement.
Il faudra bien que j'y arrive affraid
Après, mon plan est défini et il n'y aura plus qu'à dérouler
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2396
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyMer 5 Oct 2022 - 23:38

Bonsoir à tous !

Minibug a écrit:
ET toi Marc ou en est ton programme ?

Mon programme est à l’arrêt. Je n’étais pas disponible le week-end dernier pour y travailler.
Silverman a diffusé une solution parfaitement fonctionnelle  cheers , je n’irai pas plus loin pour l’instant.
Mindstorm nous prépare aussi une version. Very Happy
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyJeu 6 Oct 2022 - 2:08

mindstorm a écrit:
Pour l'instant je suis un peut noyer (quatre jours déjà) avec les transformation des coordonnées cartésienne en coordonnées sphérique
et inversement.

Coordonnées sphériques:

Les trois coordonnées d'un point P sont r, theta et phi.
r mesure la longueur du rayon vecteur qui va de O à P
L'angle theta mesure l'inclinaison de ce rayon vecteur à l'axe Oz et phi mesure l'angle à partir de l'axe Ox de la projection du rayon vecteur sur le plan xOy.

Les équations de transformations sont :

x = r*sin(theta)*cos(phi)
y = r*sin(theta)*sin(phi)
z = r*cos(theta)
<==>
r = sqr(x² + y² + z²)
phi = atn(y/x) = asin(y / sqr(x² + y²)) = acos(x / sqr(x² + y²))
theta = acos(z / r) = atn(sqr(x² + y²) / z)

Remarque : Pour phi , la formule ci-dessus n'est valable que pour x > 0.
Dans le cas général, il faut utiliser la fonction atan2(y,x) qui n'est malheuseument pas implementée dans Panoramic.
Si tu en as besoin, je peux fournir un code de cette fonction.


@ Minibug et les autres:
Pardon pour ce hors-sujet!
Je voulais simplement répondre à notre ami mindstorm.

Bon courage et bonne continuation pour ce beau projet du Rubik's Cube.
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyJeu 6 Oct 2022 - 8:22

Bonjour Papydall,

Citation :
@ Minibug et les autres:
Pardon pour ce hors-sujet!
Je voulais simplement répondre à notre ami mindstorm.

Pas de problème. Et tant qu'on y apprends quelque chose c'est toujours bénéfique ! Laughing

@Papydall et @tous avez vous vu le programme de Silverman sur la page précédente ?
Il a relevé le défi du rubik's cube et en plus avec un code relativement court !

On attends les autres approches de Mindstorm et Marc.
A suivre... Wink

PS : A mince je crois que Marc a déclaré forfait...
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Jean Claude

Jean Claude


Nombre de messages : 5950
Age : 69
Localisation : 83 Var
Date d'inscription : 07/05/2009

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyJeu 6 Oct 2022 - 12:13

Bonjour à tous,

J'ai téléchargé à partir de ce lien fourni par minibug  =>rubikscube
Formidable ! cheers
A+
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2396
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyJeu 6 Oct 2022 - 12:43

Bonjour à tous !

Maintenant que notre ami Silverman a réussi à faire tourner les faces du cube sans accroc, je me suis concentré sur le déplacement de la caméra suivant les axes x et y de la souris.

Le code ci-dessous permet de faire tourner la caméra autour du Rubik’s Cube, à l’horizontale ou à la verticale sans déformation.

Utilisez le cliquer-déplacer pour orienter la vue.

Pour faire fonctionner le programme, vous aurez besoin du cube.3ds de Mindstorm et de votre texture préférée pour habiller les petits cubes.

Code:
' Déplacement caméra suivant (x,y) de la souris
label orienterCube, quitter

dim x_positionCamera%, y_positionCamera%, z_positionCamera%
dim x_souris%, y_souris%, x%, y%, z%, i%, distanceCamera%, y1%

degrees

interfaceGraphique3D()

end
' ------------------------------------------------------------------------------
orienterCube:
    off_mouse_down 1

    ' on quitte le sous-programme si c'est le bouton droit de la souris qui est enfoncé
    if mouse_right_down(1) = 1
        on_mouse_down 1,orienterCube
        return
    end_if

    x_souris% = mouse_x_position(1)
    y_souris% = mouse_y_position(1)

    while mouse_left_up(1) = 0
        x% = mouse_x_position(1) - x_souris% + x_positionCamera%
        y% = mouse_y_position(1) - y_souris% + y_positionCamera%

        cam_x_position cos(x%) * cos(y%) * distanceCamera%
        cam_z_position sin(x%) * cos(y%) * distanceCamera%
        cam_y_position sin(y%) * distanceCamera%

        ' orientation de la caméra sur son propre axe de visée (axe Z).
        y1% = y%

        y1% = mod(y1%,360)

        if ((y1% > 89 ) and (y1% < 270 )) or ((y1% < -89) and (y1% > -270))
            cam_roll 180
        else
            cam_roll 0
        end_if

        pause 20
    end_while

    ' mémorisation de la nouvelle position de la caméra
    x_positionCamera% = mouse_x_position(1) - x_souris% + x_positionCamera%
    y_positionCamera% = mouse_y_position(1) - y_souris% + y_positionCamera%

    on_mouse_down 1,orienterCube
return
' ------------------------------------------------------------------------------
sub interfaceGraphique3D()
    dim_local i%

    ' créer la fenêtre principale
    width 0,width(0) - width_client(0) + 500
    height 0,height(0) - height_client(0) + 500

    ' créer la scène 3d
    scene3d 1
    width 1,500
    height 1,500
    color 1,20,20,20
 
    ' placement de la caméra au lancement du programme
    distanceCamera% = 12
    x_positionCamera% = 54
    y_positionCamera% = 25
    cam_x_position cos(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera%
    cam_z_position sin(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera%
    cam_y_position sin(y_positionCamera%) * distanceCamera%
 
    ' création des 27 cubes texturés
    for i% = 1 TO 27
        3d_mesh i%
        3d_load_object i%,"cube.3ds"
        3d_load_texture i%,"cube.bmp"
    next i%

    ' disposition des cubes dans les différentes tranches
    ' avant    centre    arrière
    ' 1 2 3    10 11 12  19 20 21 
    ' 4 5 6    13 14 15  22 23 24
    ' 7 8 9    16 17 18  25 26 27

    ' tranche avant
    3d_position 1,-2,2,2
    3d_position 2,0,2,2
    3d_position 3,2,2,2
    3d_position 4,-2,0,2
    3d_position 5,0,0,2
    3d_position 6,2,0,2
    3d_position 7,-2,-2,2
    3d_position 8,0,-2,2
    3d_position 9,2,-2,2

    ' tranche centrale
    3d_position 10,-2,2,0
    3d_position 11,0,2,0
    3d_position 12,2,2,0
    3d_position 13,-2,0,0
    3d_position 14,0,0,0
    3d_position 15,2,0,0
    3d_position 16,-2,-2,0
    3d_position 17,0,-2,0
    3d_position 18,2,-2,0
 
    ' tranche arrière
    3d_position 19,-2,2,-2
    3d_position 20,0,2,-2
    3d_position 21,2,2,-2
    3d_position 22,-2,0,-2
    3d_position 23,0,0,-2
    3d_position 24,2,0,-2
    3d_position 25,-2,-2,-2
    3d_position 26,0,-2,-2
    3d_position 27,2,-2,-2

    on_mouse_down 1,orienterCube
end_sub
' ------------------------------------------------------------------------------
quitter:
    terminate
return

Edit du 09/10/2022 14:55 Modification / amélioration du code.


Dernière édition par Marc le Dim 9 Oct 2022 - 14:57, édité 1 fois
Revenir en haut Aller en bas
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyJeu 6 Oct 2022 - 18:49

Merci Papydall
C'est bien avec ces formules (trouvés dans un vieux livre de math)que je me bats.
En effet theta=90 est parfait pour les rotations suivant l'axe des Z mais pour les rotation en X et Y
Pour X et Y, a force de tourner en rond, j'ai pris le décision de faire un tableur excel pour tester de manière rustique.
Papydall a écrit:
Coordonnées sphériques:
Les trois coordonnées d'un point P sont r, theta et phi.
r mesure la longueur du rayon vecteur qui va de O à P
L'angle theta mesure l'inclinaison de ce rayon vecteur à l'axe Oz et phi mesure l'angle à partir de l'axe Ox de la projection du rayon vecteur sur le plan xOy.
Je ne suis pas fière de la méthode mais je n'ai eu ce résultat qu'hier soir.
merci pour ton soutient


Dernière édition par mindstorm le Dim 9 Oct 2022 - 9:35, édité 1 fois
Revenir en haut Aller en bas
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptySam 8 Oct 2022 - 22:45

Il me restait un soucis
Je ne parviens pas à faire la liaison entre ces action  drunken
Ca alors, Je l'avais sous les yeux
dans un repère sphérique le Y est en HAUT
merci à tous


Dernière édition par mindstorm le Dim 9 Oct 2022 - 9:37, édité 3 fois
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2396
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyDim 9 Oct 2022 - 9:25

Bonjour Mindstorm et bonjour à tous !

Mindstorm a écrit:
Je ne parviens pas à faire la liaison entre ces action

Je n'ai pas compris ce que tu souhaites faire exactement.
J'ai testé ton programme ci-dessus, tout semble tourner.
Est-ce un problème de déplacement de la caméra autour du cube ?
Revenir en haut Aller en bas
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyDim 9 Oct 2022 - 9:32

excuse moi Marc nous nous sommes croisé
C'est bien un problème de rotation de la caméra.
Comme la nuit porte conseil...je me suis souvenu qu'il ne faut pas vouloir faire deux chose à la fois pale
Bref l’équation est juste et le soucis est entre la chaise et l'écran.
Pour la rotation camera il me faut juste un cam_roll pour l'orientation suivant Z et le plus gros sera fait
merci encore


Dernière édition par mindstorm le Lun 10 Oct 2022 - 13:01, édité 1 fois
Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2396
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyDim 9 Oct 2022 - 9:42

@Mindstorm

Ok, pas de soucis. Oui, il faut utiliser cam_roll.

Tu as un exemple dans le source que j'ai posté un peu plus haut, le jeudi 06 octobre à 12h43.
C'est dans le sous-programme orienterCube.

Pour éviter les instructions degree_to_radian, tu peux mettre en tête de ton programme l'instruction DEGREES : tous les calculs seront automatiquement effectués en degrés.


Bonne programmation !
Revenir en haut Aller en bas
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyDim 9 Oct 2022 - 12:12

Merci Marc
je ne voulais pas copier mais ... No tu me fais gagner pas mal de temps sunny


Dernière édition par mindstorm le Lun 10 Oct 2022 - 13:01, édité 1 fois

Jean Claude aime ce message

Revenir en haut Aller en bas
Marc

Marc


Nombre de messages : 2396
Age : 63
Localisation : TOURS (37)
Date d'inscription : 17/03/2014

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyDim 9 Oct 2022 - 14:32

J'ai modifié et affiné l'algorithme qui détermine le moment où la caméra doit opérer une rotation de 180°.

Nouveau code :
Code:
       y1% = y%

        y1% = mod(y1%,360)

        if ((y1% > 89 ) and (y1% < 270 )) or ((y1% < -89) and (y1% > -270))
            cam_roll 180
        else
            cam_roll 0
        end_if

Et le code complet :
Code:
' Déplacement caméra suivant (x,y) de la souris
label orienterCube, quitter

dim x_positionCamera%, y_positionCamera%, z_positionCamera%
dim x_souris%, y_souris%, x%, y%, z%, i%, distanceCamera%, y1%

degrees

interfaceGraphique3D()

end
' ------------------------------------------------------------------------------
orienterCube:
    off_mouse_down 1

    ' on quitte le sous-programme si c'est le bouton droit de la souris qui est enfoncé
    if mouse_right_down(1) = 1
        on_mouse_down 1,orienterCube
        return
    end_if

    x_souris% = mouse_x_position(1)
    y_souris% = mouse_y_position(1)

    while mouse_left_up(1) = 0
        x% = mouse_x_position(1) - x_souris% + x_positionCamera%
        y% = mouse_y_position(1) - y_souris% + y_positionCamera%

        cam_x_position cos(x%) * cos(y%) * distanceCamera%
        cam_z_position sin(x%) * cos(y%) * distanceCamera%
        cam_y_position sin(y%) * distanceCamera%

        ' orientation de la caméra sur son propre axe de visée (axe Z).
        y1% = y%

        y1% = mod(y1%,360)

        if ((y1% > 89 ) and (y1% < 270 )) or ((y1% < -89) and (y1% > -270))
            cam_roll 180
        else
            cam_roll 0
        end_if

        pause 20
    end_while

    ' mémorisation de la nouvelle position de la caméra
    x_positionCamera% = mouse_x_position(1) - x_souris% + x_positionCamera%
    y_positionCamera% = mouse_y_position(1) - y_souris% + y_positionCamera%

    on_mouse_down 1,orienterCube
return
' ------------------------------------------------------------------------------
sub interfaceGraphique3D()
    dim_local i%

    ' créer la fenêtre principale
    width 0,width(0) - width_client(0) + 500
    height 0,height(0) - height_client(0) + 500

    ' créer la scène 3d
    scene3d 1
    width 1,500
    height 1,500
    color 1,20,20,20
   
    ' placement de la caméra au lancement du programme
    distanceCamera% = 12
    x_positionCamera% = 54
    y_positionCamera% = 25
    cam_x_position cos(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera%
    cam_z_position sin(x_positionCamera%) * cos(y_positionCamera%) * distanceCamera%
    cam_y_position sin(y_positionCamera%) * distanceCamera%
   
    ' création des 27 cubes texturés
    for i% = 1 TO 27
        3d_mesh i%
        3d_load_object i%,"cube.3ds"
        3d_load_texture i%,"cube.bmp"
    next i%

    ' disposition des cubes dans les différentes tranches
    ' avant    centre    arrière
    ' 1 2 3    10 11 12  19 20 21   
    ' 4 5 6    13 14 15  22 23 24
    ' 7 8 9    16 17 18  25 26 27

    ' tranche avant
    3d_position 1,-2,2,2
    3d_position 2,0,2,2
    3d_position 3,2,2,2
    3d_position 4,-2,0,2
    3d_position 5,0,0,2
    3d_position 6,2,0,2
    3d_position 7,-2,-2,2
    3d_position 8,0,-2,2
    3d_position 9,2,-2,2

    ' tranche centrale
    3d_position 10,-2,2,0
    3d_position 11,0,2,0
    3d_position 12,2,2,0
    3d_position 13,-2,0,0
    3d_position 14,0,0,0
    3d_position 15,2,0,0
    3d_position 16,-2,-2,0
    3d_position 17,0,-2,0
    3d_position 18,2,-2,0
   
    ' tranche arrière
    3d_position 19,-2,2,-2
    3d_position 20,0,2,-2
    3d_position 21,2,2,-2
    3d_position 22,-2,0,-2
    3d_position 23,0,0,-2
    3d_position 24,2,0,-2
    3d_position 25,-2,-2,-2
    3d_position 26,0,-2,-2
    3d_position 27,2,-2,-2

    on_mouse_down 1,orienterCube
end_sub
' ------------------------------------------------------------------------------
quitter:
    terminate
return

Jean Claude aime ce message

Revenir en haut Aller en bas
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyDim 9 Oct 2022 - 17:44

@minibug
J'ai ajouté une variable vitesse pour accélérer la rotation des couronnes, c'est plus agréable je trouve. Très peu de modifications de la sub sub rotation_couronne(), aucun changement pour l'utiliser:
Code:
sub rotation_couronne(Angle_rot,axe$,face$)
 dim_local vit%
  if mod(angle_rot,360)=0
      exit_sub
  else
      angle_rot=mod(angle_rot,360)
  end_if
  axe$=lower$(axe$)
  if axe$<>"x" and axe$<>"y" and axe$<>"z" then exit_sub
  if axe$="x" then pos%=posX%
  if axe$="y" then pos%=posY%
  if axe$="z" then pos%=posZ%
  if face$<>"-2" and face$<>"0" and face$<>"2" then exit_sub
  '
  Norient%=pos%+6
  rot%=pos%-2
  vit%=3 :' combinaisons des chiffres 2,3,3,5   Ex.:vit%=2, ou 3, ou 12, etc...
  '
  for A%=0 to Angle_rot step sgn(Angle_rot)*vit%
   if A%<>0
      for i%=1 to 27
        if grid_read$(1,i%,pos%)=face$
            '
            objX=val(grid_read$(1,i%,posX%))
            objY=val(grid_read$(1,i%,posY%))
            objZ=val(grid_read$(1,i%,posZ%))
            Matrice_Rotation(objX,objY,objZ,A%,rot%)
            '
            3d_position i%,x,y,z
            '
            tmp=val(grid_read$(1,i%,Norient%))
            if Norient%=NorientX% and abs(tmp)>1 then tmp=0-tmp
            if Norient%=NorientY% and abs(tmp)=1 then tmp=0-tmp
            if Norient%=NorientZ% and abs(tmp)=1 then tmp=0-tmp
            '
            select tmp
              case -3: 3d_z_rotate i%,o3d_z_rotate(i%)-vit%*sgn(Angle_rot)
              case -2: 3d_y_rotate i%,o3d_y_rotate(i%)-vit%*sgn(Angle_rot)
              case -1: 3d_x_rotate i%,o3d_x_rotate(i%)-vit%*sgn(Angle_rot)
              case 1 : 3d_x_rotate i%,o3d_x_rotate(i%)+vit%*sgn(Angle_rot)
              case 2 : 3d_y_rotate i%,o3d_y_rotate(i%)+vit%*sgn(Angle_rot)
              case 3 : 3d_z_rotate i%,o3d_z_rotate(i%)+vit%*sgn(Angle_rot)
            end_select
        end_if
      next i%
      display
   end_if
  next A%

  ' mise à jour des données
  for i%=1 to 27
      if grid_read$(1,i%,pos%)=face$
        '
        ' positions
        x=val(grid_read$(1,i%,posX%))
        y=val(grid_read$(1,i%,posY%))
        z=val(grid_read$(1,i%,posZ%))
        Matrice_Rotation(x,y,z,Angle_rot,rot%)
        grid_write 1,i%,posX%,str$(x)
        grid_write 1,i%,posY%,str$(y)
        grid_write 1,i%,posZ%,str$(z)
        '
        ' sens de rotation
        x=val(grid_read$(1,i%,NorientX%))
        y=val(grid_read$(1,i%,NorientY%))
        z=val(grid_read$(1,i%,NorientZ%))
        Matrice_Rotation(x,y,z,Angle_rot,rot%)
        grid_write 1,i%,NorientX%,str$(x)
        grid_write 1,i%,NorientY%,str$(y)
        grid_write 1,i%,NorientZ%,str$(z)
      end_if
  next i%
end_sub

@marc
Ton code fonctionne vraiment bien!

Jean Claude aime ce message

Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyDim 9 Oct 2022 - 20:57

Salut tout le monde.

J'ai téléchargé à partir du lien donné par Jean Claude que je salue.
C'est vraiment du beau travail!
Merci à tout ceux qui ont participé à ce code.

J'ai voulu apporter mon grain de sel ( et de poivre aussi).
J'ai tout chambardé (difficile de modifier un code dont on n'est pas l'auteur).
J'ai apporté un peu beaucoup de modifications, d'ajouts, etc...
Dans le menu, actuellement seul le sous-menu Tester un algo du sous-menu Tester le rubik's cube est fonctionnel.

Remarque : J'ai déplacé les images des flèches ainsi que cube.bmp et cube.3ds dans un sous-dossier Images du dossier du programme. En tenir compte dans, SUB creation_scene() en ligne 96.

Je vous soumets ma copie et c'est à vous de juger.


Code:

rem ============================================================================
rem                 Programme RUBIK’S CUBE Réalisé par Silverman                  
rem                                    -------                                                                    
rem           Interface graphique et réaménagement du code par Minibug          
rem                                    -------                                    
rem                       Avec la participation de Papydall
rem                                    -------
rem                     Réalisation Septembre-Octobre 2022
rem ============================================================================

creation_label()
Menu()
creation_variables()
creation_scene()
creation_graphique()
GUI()
END
rem ============================================================================
SUB Menu()
    dim_local i%
    main_menu 9900
       sub_menu 9901 : parent 9901,9900 : caption 9901,"Rubik's cube"
       sub_menu 9902 : parent 9902,9901 : caption 9902,"Réinitialiser le rubik's cube"
       sub_menu 9903 : parent 9903,9901 : caption 9903,"Mélanger le rubik's cube"
       sub_menu 9904 : parent 9904,9901 : caption 9904,"Résoudre le rubik's cube"
       sub_menu 9905 : parent 9905,9901 : caption 9905,"-"
       sub_menu 9906 : parent 9906,9901 : caption 9906,"Quitter"
       ' -----------------------------------------------------------------------
       sub_menu 9910 : parent 9910,9900 : caption 9910,"Tester le rubik's cube"
       sub_menu 9911 : parent 9911,9910 : caption 9911,"Tester le mélange"
       sub_menu 9912 : parent 9912,9910 : caption 9912,"Tester un algo"
       sub_menu 9913 : parent 9913,9912 : caption 9913,"The Super Flip"
       sub_menu 9914 : parent 9914,9912 : caption 9914,"the-easy-checkerboard"
       sub_menu 9915 : parent 9915,9912 : caption 9915,"Hi"
       sub_menu 9916 : parent 9916,9912 : caption 9916,"Plus-Minus"
       sub_menu 9917 : parent 9917,9912 : caption 9917,"dot-cross-line"
       sub_menu 9918 : parent 9918,9912 : caption 9918,"flower-with-stem"
      
       ' etc..
       ' -----------------------------------------------------------------------
       sub_menu 9950 : parent 9950,9900 : caption 9950,"?"
       sub_menu 9951 : parent 9951,9950 : caption 9951,"Aide"    
       sub_menu 9952 : parent 9952,9950 : caption 9952,"A-Propos"
      
    for i% = 9902 to 9906 : on_click i%,choix_menu : next i%
    for i% = 9911 to 9918 : on_click i%,choix_menu : next i%
    for i% = 9951 to 9952 : on_click i%,choix_menu : next i%  
      
END_SUB
rem ============================================================================
Choix_menu:
    select number_click
        case 9902 : Reinitialiser_Rubik()
        case 9903 : Melanger_Rubik()
        case 9904 : Resoudre_Rubik()
        case 9905 : ' Ne rien faire !
        case 9906 : terminate
        case 9911 : Tester_Melange()
        case 9913 : Super_Flip()
        case 9914 : CheckerBoard()
        case 9915 : Hi()
        case 9916 : Plus_Minus()
        case 9917 : Dot_Cross_Line()
        case 9918 : Flower_with_stem()
        ' etc..
        case 9951 : Aide()
        case 9952 : Propos()
                
    end_select
return
rem ============================================================================
SUB GUI()
    alpha 9961 : top 9961,80  : left 9961, 600+20 : font_bold 9961
    font_name 9961,"arial"    : font_color 9961,0,255,255 : font_size 9961,14
    alpha 9962 : top 9962,120 : left 9962, 600+20 : font_bold 9962
    font_name 9962,"arial"    : font_color 9962,255,255,0 : font_size 9962,14
    
END_SUB
rem ============================================================================
' ------------------------------ CREATION DES LABEL -----------------------------
SUB creation_label()
   LABEL clic, choix_menu
END_SUB
rem ============================================================================
' --------------------------- CREATION DES VARIABLES ---------------------------
SUB creation_variables()
   DIM no% , clic%
   DIM form% , tableau% , scene% , panel%(18),image%(18)
   DIM i% , A% , x,y,z , posX%,posY%,posZ% , NorientX%,NorientY%,NorientZ%  
   posX% = 3 : posY% = 4 : posZ% = 5 : NorientX% = 9 : NorientY% = 10 : NorientZ% = 11
END_SUB
rem ============================================================================
' ---------------------------- CREATION DU SCENE_3D ----------------------------
sub creation_scene()
   DIM_LOCAL obj%
   dir_change dir_current$ + "\Images"
   WIDTH no%,600+600 : HEIGHT no%,600+100 : COLOR no%,136,109,110
   CAPTION 0,"Rubik's cube Par Silverman - finitions par Minibug - participation de Papydall"
    form% = no% : no% = no% + 1  
   ' données stockées dans un grid
   GRID no% : HIDE no% : GRID_ROW no%,27 : GRID_ROW_FIXED no%,0
   GRID_COLUMN no%,11 : GRID_COLUMN_FIXED no%,0 : tableau% = no% : no% = no% + 1  
   ' creation scène
   DEGREES
   SCENE3D no% : HEIGHT no%,HEIGHT_CLIENT(form%)-100 : WIDTH no%,600
   COLOR no%,136,109,110 : scene% = no% : no% = no% + 1  
   ' la caméra est créée en 0,0,5 / on la déplace pour voir 3 faces du cube
   CAM_POSITION -10,6,6  
   ' on crée 27 cubes texturés
   FOR i% = 1 TO 27
      3D_MESH i% : 3D_LOAD_OBJECT i%,"cube.3ds" : 3D_LOAD_TEXTURE i%,"Cube.bmp"
   NEXT i%  
   ' X axe rouge - rotation anti-horaire
   ' Y axe vert - rotation horaire
   ' Z axe bleu - rotation horaire
   ' ---------------------------------------------------------------------------
   ' placement et texturage des objets
   obj% = 0
   FOR x = -2 TO 2 STEP 2
      FOR y = -2 TO 2 STEP 2
         FOR z = -2 TO 2 STEP 2
            obj% = obj% + 1            
            ' placer les cubes
            3D_POSITION obj%,x,y,z            
            ' position et orientation mémorisées dans un grid
            GRID_WRITE tableau%,obj%,posX%,STR$(x)
            GRID_WRITE tableau%,obj%,posY%,STR$(y)
            GRID_WRITE tableau%,obj%,posZ%,STR$(z)
            GRID_WRITE tableau%,obj%,NorientX%,"1"
            GRID_WRITE tableau%,obj%,NorientY%,"2"
            GRID_WRITE tableau%,obj%,NorientZ%,"3"
         NEXT z
      NEXT y
   NEXT x  
END_SUB
rem ============================================================================
' ----------------------------- CREATION GRAPHIQUE -----------------------------
SUB creation_graphique()  
  ' Création des boutons sous forme de flèches
  FOR i% = 1 TO 18
     PANEL no% : WIDTH no%,50 : HEIGHT no%,50 : panel%(I%) = no% : no% = no% + 1
     PICTURE no% : PARENT no%,no%-1 : WIDTH no%,50 : HEIGHT no%,50
        STRETCH_ON no% : ON_CLICK no%,clic : image%(i%) = no% : no% = no% + 1
  NEXT i%
  ' ----------------------------------------------------------------------------
  ' Rotation Z
  LEFT panel%(1),270 : TOP panel%(1),090 : FILE_LOAD image%(1),"FlecheZb.bmp"
     hint panel%(1),"1/4 de tour, sens horaire, face gauche"
     no% = no% + 1
     button no% : top no%,070 : left no%,290 : width no%,20 : caption no%,"L"  
  LEFT panel%(2),320 : TOP panel%(2),100 : FILE_LOAD image%(2),"FlecheZb.bmp"
     hint panel%(2),"1/4 de tour de haut en bas, courone entre les faces gauche et droit"
     no% = no% + 1
     button no% : top no%,080 : left no%,340 : width no%,20 : caption no%,"M"
  
  LEFT panel%(3),370 : TOP panel%(3),110 : FILE_LOAD image%(3),"FlecheZb.bmp"
     hint panel%(3),"1/4 de tour, sens anti-horaire, face droite"
     no% = no% + 1
     button no% : top no%,90 : left no%,390 : width no%,20 : caption no%,"R'"
    
  LEFT panel%(4),170 : TOP panel%(4),410 : FILE_LOAD image%(4),"FlecheZh.bmp"
     hint panel%(4), "1/4 de tour, sens anti-horaire, face gauche"
     no% = no% + 1
     button no% : top no%,460 : left no%,185 : width no%,20 : caption no%,"L'"
    
  LEFT panel%(5),220 : TOP panel%(5),435 : FILE_LOAD image%(5),"FlecheZh.bmp"
     hint panel%(5),"1/4 de tour de bas en haut, courone entre les faces gauche et droit"
     no% = no% + 1
     button no% : top no%,485 : left no%,235 : width no%,20 : caption no%,"M'"
    
  LEFT panel%(6),270 : TOP panel%(6),460 : FILE_LOAD image%(6),"FlecheZh.bmp"
     hint panel%(6),"1/4 de tour, sens horaire, face droite"
     no% = no% + 1
     button no% : top no%,510 : left no%,285 : width no%,20 : caption no%,"R"
  ' ----------------------------------------------------------------------------  
  ' Rotation X
  LEFT panel%(07),140 : TOP panel%(07),110 : FILE_LOAD image%(07),"FlecheXb.bmp"
     hint panel%(7),"1/4 de tour, sens horaire, face avant"
     no% = no% + 1
     button no% : top no%, 85 : left no%,155 : width no%,20 : caption no%,"F"
    
  LEFT panel%(08),180 : TOP panel%(08),100 : FILE_LOAD image%(08),"FlecheXb.bmp"
     hint panel%(8),"1/4 de tour de gauche à droite, couronne entre les faces avant et arrière"
     no% = no% + 1
     button no% : top no%,75 : left no%,195 : width no%,20 : caption no%,"S"
    
  LEFT panel%(09),220 : TOP panel%(09),090 : FILE_LOAD image%(09),"FlecheXb.bmp"
     hint panel%(9),"1/4 de tour, sens anti-horaire, face arrière"
     no% = no% + 1
     button no% : top no%,65 : left no%,235 : width no%,20 : caption no%,"B'"
    
  LEFT panel%(10),370 : TOP panel%(10),410 : FILE_LOAD image%(10),"FlecheXh.bmp"
     hint panel%(10), "1/4 de tour, sens anti-horaire, face avant"
     no% = no% + 1
     button no% : top no%,460 : left no%,385 : width no%,20 : caption no%,"F'"
    
  LEFT panel%(11),390 : TOP panel%(11),370 : FILE_LOAD image%(11),"FlecheXh.bmp"
     hint panel%(11),"1/4 de tour de droite à gauche, couronne entre les faces avant et arrière"
     no% = no% + 1
     button no% : top no%,395 : left no%,440 : width no%,20 : caption no%,"S'"
    
  LEFT panel%(12),410 : TOP panel%(12),340 : FILE_LOAD image%(12),"FlecheXh.bmp"
     hint panel%(12),"1/4 de tour, sens horaire, face arrière"
     no% = no% + 1
     button no% : top no%,355 : left no%,460 : width no%,20 : caption no%,"B"
    
  ' Rotation Y
  LEFT panel%(13),070 : TOP panel%(13),200 : FILE_LOAD image%(13),"FlecheYg.bmp"
     hint panel%(13),"1/4 de tour, sens anti-horaire, face haut"
     no% = no% + 1
     button no% : top no%,220 : left no%,50 : width no%,20 : caption no%,"U"
    
  LEFT panel%(14),080 : TOP panel%(14),260 : FILE_LOAD image%(14),"FlecheYg.bmp"
     hint panel%(14),"1/4 de tour de gauche à droite de la couronne entre les faces haut et bas"
     no% = no% + 1
     button no% : top no%,280 : left no%,060 : width no%,20 : caption no%,"E"
    
  LEFT panel%(15),090 : TOP panel%(15),320 : FILE_LOAD image%(15),"FlecheYg.bmp"
     hint panel%(15),"1/4 de tour, sens horaire, face bas"
     no% = no% + 1
     button no% : top no%,330 : left no%,070 : width no%,20 : caption no%,"D"
    
  LEFT panel%(16),450 : TOP panel%(16),180 : FILE_LOAD image%(16),"FlecheYd.bmp"
     hint panel%(16),"1/4 de tour, sens horaire, face haut"
     no% = no% + 1
     button no% : top no%,190 : left no%,500 : width no%,20 : caption no%,"U'"
    
  LEFT panel%(17),440 : TOP panel%(17),230 : FILE_LOAD image%(17),"FlecheYd.bmp"
     hint panel%(17),"1/4 de tour de droite à gauche de la couronne entre les faces haut et bas"
     no% = no% + 1
     button no% : top no%,250 : left no%,490 : width no%,20 : caption no%,"E'"
    
  LEFT panel%(18),430 : TOP panel%(18),280 : FILE_LOAD image%(18),"FlecheYd.bmp"
     hint panel%(18),"1/4 de tour, sens anti-horaire, face bas"
     no% = no% + 1
     button no% : top no%,290 : left no%,480 : width no%,20 : caption no%,"D'"
    
END_SUB
rem ============================================================================
' --------------------------- ROTATION DES COURONNES ---------------------------
SUB rotation_couronne(Angle_rot,axe$,face$)
   DIM_LOCAL objX,objY,objZ,pos%,rot%,Norient%,tmp
   IF MOD(angle_rot,360) = 0
      EXIT_SUB
   ELSE
      angle_rot = MOD(angle_rot,360)
   END_IF
   axe$ = LOWER$(axe$)
   IF axe$ <> "x" AND axe$ <> "y" AND axe$ <> "z" THEN EXIT_SUB
   IF axe$ = "x" THEN pos% = posX%
   IF axe$ = "y" THEN pos% = posY%
   IF axe$ = "z" THEN pos% = posZ%
   IF face$ <> "-2" AND face$<>"0" AND face$<>"2" THEN EXIT_SUB
   '
   Norient% = pos% + 6
   rot% = pos%-2
   '
   FOR A% = SGN(Angle_rot) TO Angle_rot STEP SGN(Angle_rot)
      FOR i% = 1 to 27
         IF GRID_READ$(tableau%,i%,pos%) = face$
            '
            objX = VAL(GRID_READ$(tableau%,i%,posX%))
            objY = VAL(GRID_READ$(tableau%,i%,posY%))
            objZ = VAL(GRID_READ$(tableau%,i%,posZ%))
            Rot(objX,objY,objZ,A%,rot%)
            '
            3D_POSITION i%,x,y,z
            '
            tmp = VAL(GRID_READ$(tableau%,i%,Norient%))
            IF Norient% = NorientX% AND ABS(tmp)>1 THEN tmp = 0-tmp
            IF Norient% = NorientY% AND ABS(tmp) = 1 THEN tmp = 0-tmp
            IF Norient% = NorientZ% AND ABS(tmp) = 1 THEN tmp = 0-tmp
            '
            SELECT tmp
                CASE -3 : 3D_Z_ROTATE i%,O3D_Z_ROTATE(i%)-1*SGN(Angle_rot)
                CASE -2 : 3D_Y_ROTATE i%,O3D_Y_ROTATE(i%)-1*SGN(Angle_rot)
                CASE -1 : 3D_X_ROTATE i%,O3D_X_ROTATE(i%)-1*SGN(Angle_rot)
                CASE  1 : 3D_X_ROTATE i%,O3D_X_ROTATE(i%) + 1*SGN(Angle_rot)
                CASE  2 : 3D_Y_ROTATE i%,O3D_Y_ROTATE(i%) + 1*SGN(Angle_rot)
                CASE  3 : 3D_Z_ROTATE i%,O3D_Z_ROTATE(i%) + 1*SGN(Angle_rot)
            END_SELECT
         END_IF
      NEXT i%
      DISPLAY
   NEXT A%      
   ' mise à jour des données
   A% = Angle_rot
   for i% = 1 TO 27
      IF GRID_READ$(tableau%,i%,pos%) = face$      
         ' positions    
         maj_pos(rot%)        
         ' sens de rotation
         maj_Norient(rot%)
      END_IF
   NEXT i%  
END_SUB
rem ============================================================================
' ------------------------- MISE A JOUR LES POSITIONS --------------------------
SUB maj_pos(a)  
   x = VAL(GRID_READ$(tableau%,i%,posX%))
   y = VAL(GRID_READ$(tableau%,i%,posY%))
   z = VAL(GRID_READ$(tableau%,i%,posZ%))
   Rot(x,y,z,A%,a)
   GRID_WRITE tableau%,i%,posX%,STR$(x)
   GRID_WRITE tableau%,i%,posY%,STR$(y)
   GRID_WRITE tableau%,i%,posZ%,STR$(z)  
END_SUB
rem ============================================================================
' ------------------------ MISE A JOUR LES ORIENTATIONS ------------------------
SUB maj_Norient(a)
   x = VAL(GRID_READ$(tableau%,i%,NorientX%))
   y = VAL(GRID_READ$(tableau%,i%,NorientY%))
   z = VAL(GRID_READ$(tableau%,i%,NorientZ%))
   Rot(x,y,z,A%,a)
   GRID_WRITE tableau%,i%,NorientX%,STR$(x)
   GRID_WRITE tableau%,i%,NorientY%,STR$(y)
   GRID_WRITE tableau%,i%,NorientZ%,STR$(z)  
END_SUB
rem ============================================================================
' --------------------------------- ROTATIONS ----------------------------------
SUB Rot(px,py,pz,ang,axe)    
   SELECT axe
     CASE 1 : ' matrice de rotation X en sens anti horaire
            x  =  px*1  + py*0         + pz*0
            y  =  px*0  + py*COS(0-ang) -pz*SIN(0-ang)
            z  =  px*0  + py*SIN(0-ang)  + pz*COS(0-ang)
     CASE 2 : ' matrice de rotation Y en sens horaire
            x  =  px*COS(ang)      + py*0  + pz*SIN(ang)
            y  =  px*0             + py*1 -pz*0
            z  =  px*(0-SIN(ang))  + py*0  + pz*COS(ang)
     CASE 3 : ' matrice de rotation Z en sens horaire
            x  =  px*COS(ang) -py*SIN(ang)  + pz*0
            y  =  px*SIN(ang)  + py*COS(ang)  + pz*0
            z  =  px*0         + py*0         + pz*1
   END_SELECT
   x = round_float(x,3)
   y = round_float(y,3)
   z = round_float(z,3)  
END_SUB
rem ============================================================================
' ---------------------------- FONCION round_float -----------------------------
FNC round_float(round_float_mon_nb,round_float_decimales%)
   DIM_LOCAL round_float_tmp%  
   ' arrondi 'float'
   round_float_tmp% = round_float_mon_nb*POWER(10,round_float_decimales%)
   round_float_mon_nb = round_float_tmp%/(POWER(10,round_float_decimales%))
   RESULT round_float_mon_nb  
END_FNC
rem ============================================================================
' ---------------------------- GESTION DES CLICS -------------------------------
clic:
   clic% = NUMBER_CLICK  
   FOR I% = 1 TO 18
      OFF_CLICK image%(I%)
   NEXT I%
   ' Angle_rot  =   + -90 ou  + -180 ou  + -270
   ' axe$   =   "x" ou "y" ou "z"
   ' face$  =  "-2" ou "0" ou "2"
   IF clic% = image%(1) THEN rotation_couronne(90,"z",-2)   : ' L
   IF clic% = image%(2) THEN rotation_couronne(90,"z",0)    : ' M
   IF clic% = image%(3) THEN rotation_couronne(90,"z",2)    : ' R'
   IF clic% = image%(4) THEN rotation_couronne(-90,"z",-2)  : ' L'
   IF clic% = image%(5) THEN rotation_couronne(-90,"z",0)   : ' M'
   IF clic% = image%(6) THEN rotation_couronne(-90,"z",2)   : ' R
  
   IF clic% = image%(7) THEN rotation_couronne(-90,"x",-2)  : ' F
   IF clic% = image%(8) THEN rotation_couronne(-90,"x",0)   : ' S
   IF clic% = image%(9) THEN rotation_couronne(-90,"x",2)   : ' B'
   IF clic% = image%(10) THEN rotation_couronne(90,"x",-2)  : ' F'
   IF clic% = image%(11) THEN rotation_couronne(90,"x",0)   : ' S'
   IF clic% = image%(12) THEN rotation_couronne(90,"x",2)   : ' B

   IF clic% = image%(13) THEN rotation_couronne(90,"y",2)   : ' U
   IF clic% = image%(14) THEN rotation_couronne(90,"y",0)   : ' E
   IF clic% = image%(15) THEN rotation_couronne(90,"y",-2)  : ' D
   IF clic% = image%(16) THEN rotation_couronne(-90,"y",2)  : ' U'
   IF clic% = image%(17) THEN rotation_couronne(-90,"y",0)  : ' E'
   IF clic% = image%(18) THEN rotation_couronne(-90,"y",-2) : ' D'  

   FOR I% = 1 TO 18
      ON_CLICK image%(I%),clic
   NEXT I%  
RETURN
rem ============================================================================
SUB Reinitialiser_Rubik()
    message "Pas encore"
END_SUB
rem ============================================================================
SUB Melanger_Rubik()
    message "Pas encore"
END_SUB
rem ============================================================================
SUB Resoudre_Rubik()
    message "Pas encore"
END_SUB
rem ============================================================================
SUB Tester_Melange()
    message "Pas encore"
END_SUB
rem ============================================================================
' U R2 F B R B2 R U2 L B2 R U' D' R2 F R' L B2 U2 F2
SUB Super_Flip()
    dim_local algo$, inverse$
    algo$ =     " U R2 F B R B2 R U2 L B2 R U' D' R2 F R' L B2 U2 F2 "
    inverse$ = " U' R2 F' B' R' B2 R' U2 L' B2 R' U D R2 F' R L' B2 U2 F2 "
    inverse$ = " F2 U2 B2 L' R F' R2 D U R' B2 L' U2 R' B2 R' B' F' R2 U' "
  
    caption 9961," Algorithme en cours d'exécution : "
    caption 9962,algo$
    show 9962
    Execut_Algo(algo$)    
  
    caption 9961," Algorithme terminé : "
    caption 9962,algo$
    Reinit_Rubiks(inverse$)
                                  
END_SUB
rem ============================================================================
' M2 E2 S2
SUB CheckerBoard()
    dim_local algo$,inverse$    
    algo$ = " M2 E2 S2 "
    caption 9961," Algorithme en cours d'exécution : "
    caption 9962,algo$
    show 9962
    Execut_Algo(algo$)    
    inverse$ = " S2 E2 M2 "
    caption 9961," Algorithme terminé : "
    caption 9962,algo$
    Reinit_Rubiks(inverse$)

END_SUB
rem ============================================================================
' M2 U2 M2 U2
SUB Hi()
    dim_local algo$,inverse$,i
    algo$ = " M2 U2 M2 U2 "
    caption 9961," Algorithme en cours d'exécution : "
    caption 9962,algo$ : show 9962
    Execut_Algo(algo$)
    inverse$ = " U2 M2 U2 M2 "
    caption 9961," Algorithme terminé : "
    caption 9962,algo$
 
END_SUB
rem ============================================================================
' U2 R2 L2 U2 R2 L2
SUB Plus_Minus()
    dim_local algo$,inverse$,i
    algo$ = " U2 R2 L2 U2 R2 L2 "
    inverse$ = " L2 R2 U2 L2 R2 U2 "
    caption 9961," Algorithme en cours d'exécution : "
    caption 9962,algo$ : show 9962
    Execut_Algo(algo$)
 
    caption 9961," Algorithme terminé : "
    caption 9962,algo$
    Reinit_Rubiks(inverse$)

END_SUB
rem ============================================================================
' F2 L2 R2 B2 E2
SUB Dot_Cross_Line()
    dim_local algo$,inverse$
    algo$    = " F2 L2 R2 B2 E2 "
    caption 9961," Algorithme en cours d'exécution : "
    caption 9962,algo$ : show 9962
    Execut_Algo(algo$)
    inverse$ = " E2 B2 R2 L2 F2 "    
    caption 9961," Algorithme terminé : "
    caption 9962,algo$    
    Reinit_Rubiks(inverse$)

END_SUB
rem ============================================================================
' R2 D2 R2 U2 R2 F2 U2 D2 F2 U2
SUB Flower_with_stem()
    dim_local algo$,inverse$
    algo$    = " R2 D2 R2 U2 R2 F2 U2 D2 F2 U2 "
    caption 9961," Algorithme en cours d'exécution : "
    caption 9962,algo$ : show 9962
    Execut_Algo(algo$)
    inverse$ = " U2 F2 D2 U2 F2 R2 U2 R2 D2 R2 "
    caption 9961," Algorithme en cours d'exécution : "
    caption 9962,algo$
    Reinit_Rubiks(inverse$)  
END_SUB
rem ============================================================================
SUB Execut_Algo(algo$)
    dim_local r$,espace$,l,i
    algo$ = trim$(algo$) : ' retirer les espaces du debut de la fin
    algo$ = algo$ + " "  : ' ajouter un espace à la fin
    l = len(algo$)
    espace$ = " "
    i = 1 : r$ = mid$(algo$,i,1)
    while i < l
        if mid$(algo$,i+1,1) = espace$
           Execut(r$) : i = i+2 : r$ = mid$(algo$,i,1)
        else
           if mid$(algo$,i+1,1) = "2"
              execut(r$) : execut(r$) : i = i+3 : r$ = mid$(algo$,i,1)
           else
              if mid$(algo$,i+1,1) = "'"
                 execut(r$ + "'") : i = i+3 : r$ = mid$(algo$,i,1)
              end_if
           end_if
        end_if
    end_while
    
END_SUB
rem ============================================================================
SUB Execut(r$)
    ' ------------- Rotation autour de l'Axe Z ---------------------------------
    if r$ = "L"  then rotation_couronne(90,"z",-2) : exit_sub
    if r$ = "M"  then rotation_couronne(90,"z",0)  : exit_sub
    if r$ = "R'" then rotation_couronne(90,"z",2)  : exit_sub
    if r$ = "L'" then rotation_couronne(-90,"z",-2): exit_sub
    if r$ = "M'" then rotation_couronne(-90,"z",0) : exit_sub
    if r$ = "R"  then rotation_couronne(-90,"z",2) : exit_sub
    ' -------------- Rotation autour de l'axe X --------------------------------
    if r$ = "F"  then rotation_couronne(-90,"x",-2): exit_sub
    if r$ = "S"  then rotation_couronne(-90,"x",0) : exit_sub
    if r$ = "B'" then rotation_couronne(-90,"x",2) : exit_sub
    if r$ = "F'" then rotation_couronne(90,"x",-2) : exit_sub
    if r$ = "S'" then rotation_couronne(90,"x",0)  : exit_sub
    if r$ = "B"  then rotation_couronne(90,"x",2)  : exit_sub
    ' -------------- Rotation autour de l'axe Y --------------------------------
    if r$ = "U"  then rotation_couronne(90,"y",2)  : exit_sub
    if r$ = "E"  then rotation_couronne(90,"y",0)  : exit_sub
    if r$ = "D"  then rotation_couronne(90,"y",-2) : exit_sub
    if r$ = "U'" then rotation_couronne(-90,"y",2) : exit_sub
    if r$ = "E'" then rotation_couronne(-90,"y",0) : exit_sub
    if r$ = "D'" then rotation_couronne(-90,"y",-2)  
    ' --------------------------------------------------------------------------    
END_SUB
rem ============================================================================
SUB Reinit_Rubiks(inverse$)
    if message_confirmation_yes_no("Voulez-vous réinitialiser le rubik's cube ?") = 1    
       caption 9961," Algorithme en cours d'exécution : "
       caption 9962,inverse$      
       execut_algo(inverse$)
       caption 9961," Algorithme terminé : Le Rubik's cube est initialisé"  
    end_if
END_SUB
rem ============================================================================
SUB Aide()
    message "pas encore"
END_SUB
rem ============================================================================
SUB Propos()
    message "pas encore"
END_SUB
rem ============================================================================
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyLun 10 Oct 2022 - 13:06

Bonjour à tous
Heureux de te lire Papidall
peux tu me dire quelle version tu utilise?
Papydall a écrit:
dir_change dir_current$ + "\Images"
avec 0929i11 j'ai une erreur
Merci d'avance
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyLun 10 Oct 2022 - 14:33

Bonjour mindstorm

J'utilise également la dernière version, la 0.9.29i11.
D'ailleurs, peu importe la version.
L'erreur que tu signales est dûe certainement à ce que tu n'as pas créé le sous-dossier Images
Dans le dossier où se trouve le programme, crée un sous-dossier Images et transfère dans ce sous-dossier, les fichiers cube.3ds , cube.bmp ainsi que les autres images des flèches et tout ira bien.

Sinon, mets la ligne 96 en REM
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyLun 10 Oct 2022 - 15:22

Merci Papydall
Peux tu me dire ou sont les images des flèches?
merci d'avance

PS je viens de lire ton programme, sunny  MERCI "du grand Art"sunny
Revenir en haut Aller en bas
papydall

papydall


Nombre de messages : 7009
Age : 73
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyLun 10 Oct 2022 - 17:47

J'ai téléchargé le programme à partir de :
rubikscube

Le dossier contient :
cube.3ds
cube.bmp
FlecheXb.bmp
etc..
RubiksCube.bas

C'est sur ce RubiksCube.bas que j'ai apporté mes modifications et ajouts.
Personnelement, j'ai créé dans le dossier RUBIKS CUBE qui se trouve sur le bureau, un dossier Images et j'ai transféré dans ce sous-dossiers les fichiers suivants :
cube.3ds
cube.bmp
FlecheXb.bmp
FlecheXh.bmp
FlecheYd.bmp
FlecheYg.bmp
FlecheZb.bmp
FlecheZh.bmp


NB : Pour utiliser mon code, tu dois avoir :
Un dossier contenant : le programme .bas
et le  sous-dossier Images

Mais si tu veux que tous les fichiers soient dans le même dossier RUBIKS CUBE, tu dois  supprimer dans mon programme la ligne 96 dir_change dir_current$ + "\Images"

Voilà !

Bon après-midi
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyLun 10 Oct 2022 - 17:57

Bonjour les amis !

Je vois que les cubes ça intéresse les Panoramiciens (Et peut être aussi les Panoramiciennes ?)

Ca avance de tous les cotés... En individuel, en groupe... Super les amis !!

J'ai vu que Marc a mis une procédure de déplacement du cube. Il va falloir l'intégrer dans le programme.
Et concernant l'amélioration de Silverman aussi...

Je réfléchis à une nouvelle version des fléchés de déplacement...

Au fait... Est il possible de cliquer sur des tuiles 3D ou d'interagir dessus ??
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
silverman

silverman


Nombre de messages : 968
Age : 51
Localisation : Picardie
Date d'inscription : 18/03/2015

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyMer 12 Oct 2022 - 20:58

@Mindstorm
Pour m'aider avec les rotations, je me suis fais un petit programme qui ajoute du texte (+X,-X,+Y,-Y,+Z,-Z et un numéro) sur la texture de marc. Ca m'a vraiment bien aidé pour l'orientation des cubes:
Code:
height 0,600
color 0,64,64,64
picture 10
height 10,512
width 10,512
' dir_change "C:\Program Files\Panoramic Editor V 0.9.25\RUBIKS_CUBES_3D_MESH"
' image 2

file_load 10,"cubeMARC.bmp"

2d_target_is 10

print_target_is 10                             :' Diriger la sortie de PRINT vers le PICTURE
FONT_NAME 10,"arial black"                        
font_size 10,40                                :' Taille des caractères
 
2d_fill_off                                    :' désaciver le background du texte(le rendre transparent)
font_color 10,255,255,255                          :' couleur du texte


dim d,e,txt$
d=128
for e=1 to 1
file_load 10,"cubeMARC.bmp"
txt$=str$(e)
print_locate 16+d,2 : print txt$ : print_locate 30+d,52 : print "+Y"

print_locate 16,d : print txt$ : print_locate 30,d+50 : print "-Z"
print_locate 16+d,d : print txt$ : print_locate 30+d,d+50 : print "-X"
print_locate 16+d*2,d : print txt$ : print_locate 30+d*2,d+50 : print "+Z"
print_locate 16+d*3,d : print txt$ : print_locate 30+d*3,d+50 : print "+X"

print_locate 16+d,2+d*2 : print txt$ : print_locate 30+d,52+d*2 : print "-Y"
txt$="cube"+txt$+".bmp"
caption 0,txt$

' if file_exists(txt$)=1 then file_delete txt$ : pause 500 : file_save 10,txt$
next e

J'espère que ca te sera aussi utile que ça l'a été pour moi.


@Minibug
minibug a écrit:
Au fait... Est il possible de cliquer sur des tuiles 3D ou d'interagir dessus ??
Ca n'a encore jamais été vu, alors je dirais peut-être. Je vais faire des tests pour voir. C'est pour faire quoi ?

J'ai revu et nettoyé entièrement le code, un gros bug a été corrigé. Pour en faire un jeu, J'y ai ajouté les procédures:
' rotation_invisible_couronne(Angle_rot%,axe$,face$) : les rotations ne sont pas visibles, le mélange des faces est plus rapide
' reset_cube() : RAZ du rubiks cube
' sauvegarder_datas_cube() : sauvegarde l'état du rubiks cube avant un RAZ par exemple, sans modifier l'affichage en cours
' affiche_cube(grd%) : affiche le rubiks cube sauvegardé
' restaurer_datas_cube() : restaure l'état du rubiks cube après un RAZ, sans modifier l'affichage en cours
Le nouveau code:
Code:
' full_space 0
' height 0,screen_y-50 :' débogage
dir_change "C:\Program Files\Panoramic Editor V 0.9.25\RUBIKS_CUBES_3D_MESH"

dim original%,sauvegarde%
dim posX%,posY%,posZ%
dim Orientation_X%,Orientation_Y%,Orientation_Z%

dim I%,obj%,Angle_rot%,Angle%,x,y,z,Orientation_%,pos%,rot%,axe$,face$,tmp%,vitesse_rotation%
dim objX,objY,objZ

' dim txt$ :' débogage

dim axe_new,face_new,axe_old,face_old

dim nombre_de_rotation%


' n° grid
original%=1
sauvegarde%=3
' positions dans grid
posX%=3
posY%=4
posZ%=5
Orientation_X%=9
Orientation_Y%=10
Orientation_Z%=11

vitesse_rotation%=3
creation_scene()
' image 100 :' débogage
 
' MAIN
' ==============================================================================
'
' rotation_couronne(Angle_rot%,axe$,face$)
'
' Angle_rot% = +-90 ou +-180 ou +-270
' axe$  =  "x" ou "y" ou "z"
' face$ = "-2" ou "0" ou "2"
'
' ==============================================================================

' ==============================================================================
'
' rotation_invisible_couronne(Angle_rot%,axe$,face$)
'
' Angle_rot% = +-90 ou +-180 ou +-270
' axe$  =  "x" ou "y" ou "z"
' face$ = "-2" ou "0" ou "2"
'
' ==============================================================================

' ==============================================================================
'
' reset_cube()
'
'
' ==============================================================================

' ==============================================================================
'
' affiche_cube(grd%)
'
' grd% = original% ou sauvegarde%
'
' ==============================================================================

' ==============================================================================
'
' sauvegarder_datas_cube()
'
'
' ==============================================================================

' ==============================================================================
'
' restaurer_datas_cube()
'
'
' ==============================================================================

message " Les rotations sont visible"

' Rotations visible
'
'
   ' mélanger 3 fois
   for nombre_de_rotation% = 1 to 3
      Angle_rot% = aleatoire%(1,3) * 90 * sgn(rnd(1)-0.5)
      '
      ' pas 2 fois le même axe
      axe_old = axe_new
      repeat
         axe_new = aleatoire%(1,3)
      until axe_new <> axe_old
      select axe_new
         case 1: axe$="x"
         case 2: axe$="y"
         case 3: axe$="z"
      end_select
      '
      select aleatoire%(1,3)
         case 1: face$="-2"
         case 2: face$="0"
         case 3: face$="2"
      end_select
      '
      caption 0,"Test n°"+str$(nombre_de_rotation%)+" :  Angle = "+str$(Angle_rot%)+"°  /  Axe = "+axe$+"  /  Couronne = "+face$
      '
      ' les rotations du rubiks cube sont visibles
      rotation_couronne(Angle_rot%,axe$,face$)
      '
    next nombre_de_rotation%
    

    ' mémoriser l'état du rubiks cube
    caption 0,"Sauvegarde du rubiks cube"
    sauvegarder_datas_cube()
   ' 2d_image_copy 100,0,0,500,400 2d_image_paste 100,0,500 :' débogage
    message "Le rubiks cube est sauvegardé"
    
    ' RAZ
    caption 0,"Reset"
    reset_cube()
    message "Le rubiks cube à été remis à zéro"

    ' réafficher le rubiks cube
    caption 0,"Restaurer le rubiks cube cube"
    restaurer_datas_cube()
    affiche_cube(sauvegarde%)
    message "Le rubiks cube est restauré"


    reset_cube()
message " Les rotations ne sont plus visible"

' Rotations cachée
'
'
   ' mélanger 3 fois
   for nombre_de_rotation% = 1 to 3
      Angle_rot% = aleatoire%(1,3) * 90 * sgn(rnd(1)-0.5)
      '
      ' pas 2 fois le même axe
      axe_old = axe_new
      repeat
         axe_new = aleatoire%(1,3)
      until axe_new <> axe_old
      select axe_new
         case 1: axe$="x"
         case 2: axe$="y"
         case 3: axe$="z"
      end_select
      '
      select aleatoire%(1,3)
         case 1: face$="-2"
         case 2: face$="0"
         case 3: face$="2"
      end_select
      '
      caption 0,"Test n°"+str$(nombre_de_rotation%)+" :  Angle = "+str$(Angle_rot%)+"°  /  Axe = "+axe$+"  /  Couronne = "+face$
      '
      ' les rotations du rubiks cube ne sont pas visible
      rotation_invisible_couronne(Angle_rot%,axe$,face$)
      '
    next nombre_de_rotation%
    '
    message "On va visualiser et sauvegarder le rubiks cube mélangé"
    caption 0,"Visualisation et sauvegarde"
    affiche_cube(original%)
    ' mémoriser l'état du rubiks cube
    sauvegarder_datas_cube()
    ' 2d_image_copy 100,0,0,500,400 2d_image_paste 100,0,500 :' débogage
    message "Le rubiks cube a été sauvegardé"
    
    ' RAZ
    caption 0,"Reset"
    reset_cube()
    message "Le rubiks cube à été remis à zéro"

    ' réafficher le rubiks cube
    caption 0,"Restaurer le rubiks cube cube"
    restaurer_datas_cube()
    affiche_cube(sauvegarde%)
    message "Le rubiks cube est restauré"


caption 0,"Terminé"



END
' ==============================================================================

' === Creation_scene() =========================================================

' ==============================================================================
sub creation_scene()
   ' données stockées dans un grid
   create_hide
   grid original%
'   left original%,500 : width original%,800 : height original%,680 : ' débogage pour CREATE_HIDE en rem
   grid_row original%,27 : grid_row_fixed original%,0
   grid_column original%,11 : grid_column_fixed original%,0
   hide original%
  
   grid sauvegarde% :' grid de sauvegarde
'   left sauvegarde%,500 : width sauvegarde%,800 : height sauvegarde%,680 :' débogage pour CREATE_HIDE en rem
   grid_row sauvegarde%,27 : grid_row_fixed sauvegarde%,0
   grid_column sauvegarde%,11 : grid_column_fixed sauvegarde%,0
   hide sauvegarde%  
   create_show
      
   ' creation scène
   degrees
  
   SCENE3D 2:HEIGHT 2,400:WIDTH 2,500
   axes_show
   color 2,64,64,64
   ' la caméra est créée en 0,0,5
   ' on la déplace pour voir 3 faces du cube
   CAM_POSITION -10,6,6
   light_position -10,6,6
  
   ' on crée 27 cubes texturés
   FOR obj%=1 TO 27
'      txt$=str$(obj%) : 3D_MESH obj%:3D_LOAD_OBJECT obj%,"CUBE.3DS":3D_LOAD_TEXTURE obj%,"CUBE"+txt$+".BMP" :' débogage
'      3D_MESH obj%:3D_LOAD_OBJECT obj%,"CUBE.3DS":3D_LOAD_TEXTURE obj%,"CUBEmarcC.BMP" :' débogage
      3D_MESH obj%:3D_LOAD_OBJECT obj%,"CUBE.3DS":3D_LOAD_TEXTURE obj%,"CUBEmarc.BMP"
   NEXT obj%
  
   ' X axe rouge, sens de rotation anti-horaire
   ' Y axe vert, sens de rotation horaire
   ' Z axe bleu, sens de rotation horaire

   ' placement et données des objets
   obj%=0
   for x=-2 to 2 step 2
      for y=-2 to 2 step 2
         for z=-2 to 2 step 2
            obj%=obj%+1
            ' placer les cubes
            3d_position obj%,x,y,z
            
            ' position et orientation mémorisées dans un grid
            ' grid_write original%,obj%,1,str$(obj%)
            grid_write original%,obj%,posX%,str$(x)
            grid_write original%,obj%,posY%,str$(y)
            grid_write original%,obj%,posZ%,str$(z)
            '
            grid_write original%,obj%,Orientation_X%,"1"
            grid_write original%,obj%,Orientation_Y%,"2"
            grid_write original%,obj%,Orientation_Z%,"3"
         next z
      next y
   next x
   ' pointeur pour reset
   3d_cube 28,0.0000001
end_sub


' ==============================================================================

' === ROTATION_COURONNE() ======================================================

' ==============================================================================
sub rotation_couronne(Angle_rot%,axe$,face$)
   if mod(Angle_rot%,360)=0
      exit_sub
   else
      Angle_rot%=mod(Angle_rot%,360)
   end_if
   axe$=lower$(axe$)
   if axe$<>"x" and axe$<>"y" and axe$<>"z" then exit_sub
   if axe$="x" then pos%=posX%
   if axe$="y" then pos%=posY%
   if axe$="z" then pos%=posZ%
   if face$<>"-2" and face$<>"0" and face$<>"2" then exit_sub
   '
   Orientation_%=pos%+6
   rot%=pos%-2
   '
   for Angle%=0 to Angle_rot% step sgn(Angle_rot%)*vitesse_rotation%
    if Angle%<>0
      for obj%=1 to 27
         if grid_read$(original%,obj%,pos%)=face$
            '
            ' positions
            objX=val(grid_read$(original%,obj%,posX%))
            objY=val(grid_read$(original%,obj%,posY%))
            objZ=val(grid_read$(original%,obj%,posZ%))
            Matrice_Rotation(objX,objY,objZ,Angle%,rot%)
            3d_position obj%,x,y,z
            '
            ' sens de rotation
            tmp%=val(grid_read$(original%,obj%,Orientation_X%))
            if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%)
                tmp%=1*sgn(tmp%)
            else
               tmp%=val(grid_read$(original%,obj%,Orientation_Y%))
               if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%)
                   tmp%=2*sgn(tmp%)
               else
                   tmp%=val(grid_read$(original%,obj%,Orientation_Z%))
                   tmp%=3*sgn(tmp%)
               end_if
            end_if
            '
            if Orientation_%=Orientation_X% and abs(tmp%)>1 then tmp%=0-tmp%
            if Orientation_%=Orientation_Y% and abs(tmp%)=1 then tmp%=0-tmp%
            if Orientation_%=Orientation_Z% and abs(tmp%)=1 then tmp%=0-tmp%
            '
            select tmp%
               case -3: 3d_z_rotate obj%,o3d_z_rotate(obj%)-vitesse_rotation%*sgn(Angle_rot%)
               case -2: 3d_y_rotate obj%,o3d_y_rotate(obj%)-vitesse_rotation%*sgn(Angle_rot%)
               case -1: 3d_x_rotate obj%,o3d_x_rotate(obj%)-vitesse_rotation%*sgn(Angle_rot%)
               case 1 : 3d_x_rotate obj%,o3d_x_rotate(obj%)+vitesse_rotation%*sgn(Angle_rot%)
               case 2 : 3d_y_rotate obj%,o3d_y_rotate(obj%)+vitesse_rotation%*sgn(Angle_rot%)
               case 3 : 3d_z_rotate obj%,o3d_z_rotate(obj%)+vitesse_rotation%*sgn(Angle_rot%)
            end_select
         end_if
      next obj%
      display
    end_if
   next Angle%

   ' mise à jour des données
   for obj%=1 to 27
      if grid_read$(original%,obj%,pos%)=face$
         '
         ' positions
         objX=val(grid_read$(original%,obj%,posX%))
         objY=val(grid_read$(original%,obj%,posY%))
         objZ=val(grid_read$(original%,obj%,posZ%))
         Matrice_Rotation(objX,objY,objZ,Angle_rot%,rot%)
         grid_write original%,obj%,posX%,str$(x)
         grid_write original%,obj%,posY%,str$(y)
         grid_write original%,obj%,posZ%,str$(z)
         '
         ' sens de rotation
         tmp%=val(grid_read$(original%,obj%,Orientation_X%))
         if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%)
             tmp%=1*sgn(tmp%)
         else
            tmp%=val(grid_read$(original%,obj%,Orientation_Y%))
            if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%)
                tmp%=2*sgn(tmp%)
            else
                tmp%=val(grid_read$(original%,obj%,Orientation_Z%))
                tmp%=3*sgn(tmp%)
            end_if
         end_if
         '
         if Orientation_%=Orientation_X% and abs(tmp%)>1 then tmp%=0-tmp%
         if Orientation_%=Orientation_Y% and abs(tmp%)=1 then tmp%=0-tmp%
         if Orientation_%=Orientation_Z% and abs(tmp%)=1 then tmp%=0-tmp%
         '
         objX=val(grid_read$(original%,obj%,Orientation_X%))
         objY=val(grid_read$(original%,obj%,Orientation_Y%))
         objZ=val(grid_read$(original%,obj%,Orientation_Z%))
         '            
         select tmp%
            case -3: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%)
            case -2: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%)
            case -1: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%)
            case 1 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%)
            case 2 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%)
            case 3 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%)
         end_select
         '
         grid_write original%,obj%,Orientation_X%,str$(x)
         grid_write original%,obj%,Orientation_Y%,str$(y)
         grid_write original%,obj%,Orientation_Z%,str$(z)
         '
      end_if
   next obj%
end_sub


' ==============================================================================

' === ROTATION_INVISIBLE_COURONNE() ============================================

' ==============================================================================
sub rotation_invisible_couronne(Angle_rot%,axe$,face$)
   if mod(Angle_rot%,360)=0
      exit_sub
   else
      Angle_rot%=mod(Angle_rot%,360)
   end_if
   axe$=lower$(axe$)
   if axe$<>"x" and axe$<>"y" and axe$<>"z" then exit_sub
   if axe$="x" then pos%=posX%
   if axe$="y" then pos%=posY%
   if axe$="z" then pos%=posZ%
   if face$<>"-2" and face$<>"0" and face$<>"2" then exit_sub
   '
   Orientation_%=pos%+6
   rot%=pos%-2
   '
   ' mise à jour des données
   for obj%=1 to 27
      if grid_read$(original%,obj%,pos%)=face$
         '
         ' positions
         objX=val(grid_read$(original%,obj%,posX%))
         objY=val(grid_read$(original%,obj%,posY%))
         objZ=val(grid_read$(original%,obj%,posZ%))
         Matrice_Rotation(objX,objY,objZ,Angle_rot%,rot%)
         grid_write original%,obj%,posX%,str$(x)
         grid_write original%,obj%,posY%,str$(y)
         grid_write original%,obj%,posZ%,str$(z)
         '
         ' sens de rotation
         tmp%=val(grid_read$(original%,obj%,Orientation_X%))
         if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%)
             tmp%=1*sgn(tmp%)
         else
            tmp%=val(grid_read$(original%,obj%,Orientation_Y%))
            if tmp%=(Orientation_%-8) or tmp%=(8-Orientation_%)
                tmp%=2*sgn(tmp%)
            else
                tmp%=val(grid_read$(original%,obj%,Orientation_Z%))
                tmp%=3*sgn(tmp%)
            end_if
         end_if
         '
         if Orientation_%=Orientation_X% and abs(tmp%)>1 then tmp%=0-tmp%
         if Orientation_%=Orientation_Y% and abs(tmp%)=1 then tmp%=0-tmp%
         if Orientation_%=Orientation_Z% and abs(tmp%)=1 then tmp%=0-tmp%
         '
         objX=val(grid_read$(original%,obj%,Orientation_X%))
         objY=val(grid_read$(original%,obj%,Orientation_Y%))
         objZ=val(grid_read$(original%,obj%,Orientation_Z%))
         '            
         select tmp%
            case -3: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%)
            case -2: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%)
            case -1: Matrice_Rotation(objX,objY,objZ,Angle_rot%,0-tmp%)
            case 1 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%)
            case 2 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%)
            case 3 : Matrice_Rotation(objX,objY,objZ,0-Angle_rot%,tmp%)
         end_select
         '
         grid_write original%,obj%,Orientation_X%,str$(x)
         grid_write original%,obj%,Orientation_Y%,str$(y)
         grid_write original%,obj%,Orientation_Z%,str$(z)
         '
      end_if
   next obj%
end_sub


' ==============================================================================

' === RESET_CUBE() =============================================================

' ==============================================================================
sub reset_cube()
   obj%=0
   for x=-2 to 2 step 2
      for y=-2 to 2 step 2
         for z=-2 to 2 step 2
            obj%=obj%+1
            '
            ' position et orientation mémorisées dans un grid
            3d_position obj%,x,y,z
            '
            3d_rotate obj%,0,0,0 : troisD_point_position(obj%,0,0,0) : troisD_point_position(obj%,0,0,1) : ' RAZ cube  
            '
            ' positions et orientations initiales mémorisées dans un grid
            ' grid_write 1,obj%,1,str$(obj%)
            grid_write original%,obj%,posX%,str$(x)
            grid_write original%,obj%,posY%,str$(y)
            grid_write original%,obj%,posZ%,str$(z)
            '
            grid_write original%,obj%,Orientation_X%,"1"
            grid_write original%,obj%,Orientation_Y%,"2"
            grid_write original%,obj%,Orientation_Z%,"3"
         next z
      next y
   next x
   display
end_sub


' ==============================================================================

' === AFFICHER_CUBE() ==========================================================

' ==============================================================================
sub affiche_cube(grd%)
   for obj%=1 to 27
      ' RAZ
      3d_rotate obj%,0,0,0 : troisD_point_position(obj%,0,0,0) : troisD_point_position(obj%,0,0,1) : ' RAZ cube
      '
      ' orienter
      objx=val(grid_read$(grd%,obj%,Orientation_X%))
      objz=val(grid_read$(grd%,obj%,Orientation_Z%))
      orienter(obj%,objx,objz)
      '
      ' positionner
      3d_position obj%,val(grid_read$(grd%,obj%,posX%)),val(grid_read$(grd%,obj%,posY%)),val(grid_read$(grd%,obj%,posZ%))
   next obj%
   display
end_sub


' ==============================================================================

' === SAUVEGARDER_DATAS_CUBE() =================================================

' ==============================================================================
sub sauvegarder_datas_cube()
   for obj%=1 to 27
      for I%=1 to Orientation_Z%
            grid_write sauvegarde%,obj%,I%,grid_read$(original%,obj%,I%)
      next I%
   next obj%
end_sub


' ==============================================================================

' === RESTAURER_DATAS_CUBE() ===================================================

' ==============================================================================
sub restaurer_datas_cube()
   for obj%=1 to 27
      for I%=1 to Orientation_Z%
            grid_write original%,obj%,I%,grid_read$(sauvegarde%,obj%,I%)
      next I%
   next obj%
end_sub


'
' Procédures internes
'
' ==============================================================================

' === Orienter() ===============================================================

' ==============================================================================
sub orienter(obj%,x,z)
   select z
      case -1: 3d_y_rotate obj%,270
             select x
                case 3 : 3d_z_rotate obj%,0
                case 2 : 3d_z_rotate obj%,90
                case -3: 3d_z_rotate obj%,180
                case -2: 3d_z_rotate obj%,270
             end_select
      case 1 : 3d_y_rotate obj%,90
             select x
                case -3: 3d_z_rotate obj%,0
                case 2 : 3d_z_rotate obj%,90
                case 3 : 3d_z_rotate obj%,180
                case -2: 3d_z_rotate obj%,270
             end_select
      case -2: 3d_x_rotate obj%,270
             select x
                case 1 : 3d_z_rotate obj%,0
                case 3 : 3d_z_rotate obj%,90
                case -1: 3d_z_rotate obj%,180
                case -3: 3d_z_rotate obj%,270
             end_select
      case 2 : 3d_x_rotate obj%,90
             select x
                case 1 : 3d_z_rotate obj%,0
                case -3: 3d_z_rotate obj%,90
                case -1: 3d_z_rotate obj%,180
                case 3 : 3d_z_rotate obj%,270
             end_select
      case -3: 3d_x_rotate obj%,180
             select x
                case 1 : 3d_z_rotate obj%,0
                case -2: 3d_z_rotate obj%,90
                case -1: 3d_z_rotate obj%,180
                case 2 : 3d_z_rotate obj%,270
             end_select
      case 3 : 3d_x_rotate obj%,0
             select x
                case 1 : 3d_z_rotate obj%,0
                case 2 : 3d_z_rotate obj%,90
                case -1: 3d_z_rotate obj%,180
                case -2: 3d_z_rotate obj%,270
             end_select
   end_select
end_sub

' ==============================================================================

' === Matrice_Rotation() =======================================================

' ==============================================================================
sub Matrice_Rotation(px,py,pz,ang,axe)
   select axe
      case 1: ' matrice de rotation X en sens anti horaire
             x = px*1 +py*0        +pz*0
             y = px*0 +py*cos(0-ang) -pz*sin(0-ang)
             z = px*0 +py*sin(0-ang) +pz*cos(0-ang)
      case 2: ' matrice de rotation Y en sens horaire
             x = px*cos(ang)     +py*0 +pz*sin(ang)
             y = px*0            +py*1 -pz*0
             z = px*(0-sin(ang)) +py*0 +pz*cos(ang)
      case 3: ' matrice de rotation Z en sens horaire
             x = px*cos(ang) -py*sin(ang) +pz*0
             y = px*sin(ang) +py*cos(ang) +pz*0
             z = px*0        +py*0        +pz*1
   end_select
   x=round_float(x,3)
   y=round_float(y,3)
   z=round_float(z,3)
end_sub


' ==============================================================================

' === round_float() ============================================================

' ==============================================================================
fnc round_float(round_float_mon_nb,round_float_decimales%)
 dim_local round_float_tmp%
   ' arrondi 'float'
   round_float_tmp%=round_float_mon_nb*power(10,round_float_decimales%)
   round_float_mon_nb=round_float_tmp%/(power(10,round_float_decimales%))
   result round_float_mon_nb
end_fnc


' ==============================================================================

' === TroisD_point_position() ==================================================

' ==============================================================================
sub troisD_point_position(N%,x,y,z)
      3d_position 28,x+o3d_x_position(N%),y+o3d_y_position(N%),z+o3d_z_position(N%)
      3d_point_object N%,28
end_sub


' ==============================================================================

' === Aleatoire() ==============================================================

' ==============================================================================
fnc aleatoire%(aleatoire_mini,aleatoire_maxi)
   result int(rnd((aleatoire_maxi-aleatoire_mini)+0.999999999))+aleatoire_mini
end_fnc



Dernière édition par silverman le Mer 12 Oct 2022 - 21:08, édité 2 fois
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4566
Age : 57
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyMer 12 Oct 2022 - 21:07

Bonsoir Silverman et bonsoir à tous,

Je suis le fil de la discussion de loin. Je n'ai pas repris le code depuis l'installation des flèches.

Silverman a écrit:
Ca n'a encore jamais été vu, alors je dirais peut-être. Je vais faire des tests pour voir. C'est pour faire quoi ?

En fait au lieu de mettre des Picture sur des Panel je pensais installer des tuiles orientés dans le sens des faces.
Avec en habillage la flèche correspondante. Mais le soucis c'est comment cliquer sur la tuile ?
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
mindstorm

mindstorm


Nombre de messages : 685
Age : 55
Localisation : charente
Date d'inscription : 13/02/2013

Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 EmptyJeu 13 Oct 2022 - 18:12

Merci silverman pour ces textures.
Mon problème était tout autre et seulement du à mon manque de pratique...
L'axe des Z est orienté vers l'écran, je le voyais sur mon trièdre mais l'information n'allait pas jusqu'à mon cerveau.
Heureusement Marc m'a remis dans le droit chemin.
Pour la suite, j'y travail lentement quand il me reste du temps.
encore merci pour ton partage
Revenir en haut Aller en bas
Contenu sponsorisé





Projet d'un Rubik's cube en 3D - Page 5 Empty
MessageSujet: Re: Projet d'un Rubik's cube en 3D   Projet d'un Rubik's cube en 3D - Page 5 Empty

Revenir en haut Aller en bas
 
Projet d'un Rubik's cube en 3D
Revenir en haut 
Page 5 sur 9Aller à la page : Précédent  1, 2, 3, 4, 5, 6, 7, 8, 9  Suivant
 Sujets similaires
-
» The Cube
» Un p'tit cube
» cube avec belle texture
» Mon non projet en panoramic ;)
» projet d'imprimante 3D

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: