8
votes

Objet rotatif correspondant aux valeurs numériques

J'ai une serrure de combinaison tournant dans un cercle de 360 ​​degrés.

Le verrou de combinaison a des valeurs numériques à ce sujet, ce sont purement graphiques.

J'ai besoin d'un moyen de traduire la rotation de l'image vers la 0-99 valeurs sur le graphique.

Dans ce premier graphique, la valeur doit pouvoir me dire "0"

Dans ce graphique, une fois que l'utilisateur a fait pivoter l'image, la valeur doit pouvoir me dire "72"

Voici le code: xxx

Je pense avoir besoin de traduire certaines informations de la matrice à une valeur 0-99. < / p>


1 commentaires

Je voulais juste dire que ce sont de beaux graphismes.


4 Réponses :


4
votes

Ceci devrait être une simple multiplication avec un facteur "échelle" qui réduit votre valeur de degré (0-359) à votre échelle 0-99: xxx

modifier: corriger la fonction get

pour l'entrée Vous pouvez utiliser le fonction ATAN2 à la place, qui transforme les coordonnées cartésiennes dans un angle.

stocker simplement la première coordonnée tactile sur Touch Down et activé, vous pouvez appliquer le calcul suivant: xxx

Les radians ont une gamme de deux pi. Les calculs de modulo le font pivoter ainsi une valeur de 0 points en haut. Le sens de rotation est dans le sens contraire des aiguilles d'une montre.

Vous devez donc convertir cela en degrés et modifier la direction de rotation pour obtenir le bon angle.


2 commentaires

Très cool, il y a quelque chose qui ne va pas avec les variables générées dans mon étui MotionEvent.Action_Move, cette vis et une traduction un peu, pouvez-vous regarder cela?


@Cqm j'ai mis à jour mon commentaire en collant-coller quelque chose de ma base de code qui est assez similaire à ce dont vous avez besoin. Il est possible que vous ayez besoin de l'ajuster, car je n'ai pas vérifié les mathématiques derrière.



5
votes

Pour mieux comprendre ce que la matrice fait, il est utile de comprendre les matrices de transformation graphiques 2D: http: / /en.wikipedia.org/wiki/transformation_matrix#examples_in_2d_graphics . Si la seule chose que vous faites est en rotation (pas, disons, transformer ou mettre à l'échelle), il est relativement facile à extraire la rotation. Mais, plus pratiquement, vous pouvez modifier le code de rotation et stocker une variable d'état xxx

Gardez une variable pour stocker la rotation totale en degrés, que vous incrémentez dans votre fonction de rotation. Nous savons maintenant 3,6 degrés est une tique. Rendements de mathématiques simples xxx

La dernière chose que vous devez rechercher: Si vous avez une rotation de exactement 360 degrés, ou un numéro de coche de 100, vous devez le traiter comme 0 (car il n'y a pas de coche 100)


2 commentaires

Il y a des problèmes avec cela, je pense que cela a à voir avec les variables qui tournent réellement. Pouvez-vous regarder cela dans motionEvent.action_move


La variable que le rotateur accepte est un changement d'angle, ce que le code que vous avez indiqué calcule. C'est pourquoi nous stockons une variable RotationDegrees: la composition de la personne peut déplacer +90 degrés, puis -180, nous laissant à -90. Une chose qui peut être fausse, cependant, est que la rotation positive est dans le sens inverse des aiguilles d'une montre, auquel cas if (ticknumber> 0) ticknumber = 100 - CocherNumber à la place.



8
votes

Vous devez réorganiser votre code complètement. Après avoir multiplié de nouvelles rotations dans une matrice sur et encore une fois est un calcul numériquement instable. Finalement, le bitmap deviendra déformé. En essayant de récupérer l'angle de rotation de la matrice est trop complexe et inutile.

Notez d'abord que Ce est Un article préalable utile sur dessin bitmaps avec rotation autour d'un point choisi. P>

Il suffit de gérer un seul double boîte = 0 code> qui est l'angle de rotation actuel de la molette. P>

Vous faites trop de temps pour récupérer l'angle de l'emplacement tactile. Laissez (x0, y0) code> être l'emplacement où le toucher commence. A cette époque, p> xxx pré>

c'est l'angle de départ. Lorsque la touche glisse sur (x, y) code>, utilisez cette coordonnée pour régler la molette en ce qui concerne la touche initiale. Puis mettez à jour la matrice et redessinez: p> xxx pré>

note math.atan2 (y, x) code> fait tout ce que vous faites avec des quadrants et des arcsines . p>

Pour obtenir la "Cochez" de l'angle actuel, vous avez besoin de 2 radians PI pour correspondre à 100, donc c'est très simple: p> xxx pré>

à Trouvez la coche la plus proche en tant qu'oeur, autour de la fraction et du MOD par 100. Remarque Vous pouvez ignorer la matrice! P>

 int tick = (int)(fractionalTick + 0.5) % 100;


1 commentaires

Gene a raison. Vous ne devriez pas accumuler dans une matrice de transformation. Prenez la saisie de l'utilisateur, accumulez-la dans une valeur «Dialrotation» et calculez des matrices de rotation fraîches à partir de celui à chaque fois.



2
votes

Le cadran doit être tourné exactement de 3,6 degrés pour passer d'une marque à la suivante ou précédente. Chaque fois que la touche de l'utilisateur tourne (autour du centre) de 3,6 degrés, le cadran doit être tourné par 1 marque (3,6 degrés).

Code Snippet: P>

void setDialMark(int mark) {  
    rotateDialBy(mCurrentMark - mark);  
    mCurrentMark = mark;    
}

void rotateDialBy(int rotateMarks) {
    rotationAngle = rotateMarks * 3.6;
    ...
    /* Rotate the dial by rotationAngle.   */
}
  • getTouchangle () code> calcule l'angle du point tactile de l'utilisateur WRT pour connaître le centre de numérotation en utilisant ATAN2 code>. li>.
  • setDielmark code> tourne la cadran par nombre de marques modifiées. li> ul>

    . p> xxx pré> p>


0 commentaires