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. P>
J'ai besoin d'un moyen de traduire la rotation de l'image vers la 0-99 valeurs sur le graphique. P>
Dans ce premier graphique, la valeur doit pouvoir me dire "0" p>
Dans ce graphique, une fois que l'utilisateur a fait pivoter l'image, la valeur doit pouvoir me dire "72" p>
Voici le code: p> Je pense avoir besoin de traduire certaines informations de la matrice à une valeur 0-99. P> < / p>
4 Réponses :
Ceci devrait être une simple multiplication avec un facteur "échelle" qui réduit votre valeur de degré (0-359) à votre échelle 0-99: modifier: corriger la fonction get p> pour l'entrée Vous pouvez utiliser le fonction ATAN2 à la place, qui transforme les coordonnées cartésiennes dans un angle. p> stocker simplement la première coordonnée tactile sur Touch Down et activé, vous pouvez appliquer le calcul suivant: p> 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. P> Vous devez donc convertir cela en degrés et modifier la direction de rotation pour obtenir le bon angle. P> P>
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.
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 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 p> La dernière chose que vous devez rechercher: Si vous avez une rotation de exactement em> 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) p> p>
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 code> à la place.
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 Vous faites trop de temps pour récupérer l'angle de l'emplacement tactile. Laissez c'est l'angle de départ. Lorsque la touche glisse sur note 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> à 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> double boîte = 0 code> qui est l'angle de rotation actuel de la molette. P>
(x0, y0) code> être l'emplacement où le toucher commence. A cette époque, p>
(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>
math.atan2 (y, x) code> fait tout ce que vous faites avec des quadrants et des arcsines . p>
int tick = (int)(fractionalTick + 0.5) % 100;
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.
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>
Je voulais juste dire que ce sont de beaux graphismes.