2016-02-01 1 views
1

J'ai un problème mathématique intéressant que je n'arrive pas à comprendre.Calcul de l'angle des aiguilles du décalage horaire

Je suis la construction d'un cadran de montre pour l'usure Android et j'ai besoin de travailler l'angle de rotation pour les mains en fonction du temps.

D'habitude ce serait simple mais voici le kicker: les aiguilles ne sont pas centrales sur l'horloge. Disons que j'ai une horloge qui mesure 10,10 Mon point de rotation de la main des minutes se trouve à 6,6 (en bas à gauche étant 0,0) et mon aiguille des heures réside à 4,4.

Comment est-ce que je travaillerais l'angle à n'importe quelle minute donnée de sorte que le point pointe toujours à la minute correcte?

Merci

+0

Peut-être que j'ai mal compris votre réponse, mais si vous dites à appliquer simplement la main de décalage après alors le point ne viserait pas le nombre correct à la fin. prendre 12h à titre d'exemple. la rotation serait de 0 et ensuite, après avoir décalé les aiguilles, les pointes pointeraient juste à droite de 12 ou juste à gauche – doodlleus

Répondre

1

Ok, Avec l'aide de la réponse de Nico, j'ai réussi à faire des réglages et à obtenir un exemple de travail.

Les changements principaux qui ont dû être incorporés changeaient l'ordre des entrées au calcul d'atan aussi bien que faire des ajustements en raison de l'insistance d'androïde pour faire des systèmes de coordonnées à l'envers.

S'il vous plaît voir mon code ci-dessous.

 //minutes hand rotation calculation 
     int minute = mCalendar.get(Calendar.MINUTE); 

     float minutePivotX = mCenterX+minuteOffsetX; 
     //because of flipped coord system we take the y remainder of the full width instead 
     float minutePivotY = mWidth - mCenterY - minuteOffsetY; 

     //calculate target position 
     double minuteTargetX = mCenterX + mRadius * Math.cos(ConvertToRadians(minute * 6)); 
     double minuteTargetY = mCenterY + mRadius * Math.sin(ConvertToRadians(minute * 6)); 

     //calculate the direction vector from the hand's pivot to the target 
     double minuteDirectionX = minuteTargetX - minutePivotX; 
     double minuteDirectionY = minuteTargetY - minutePivotY; 

     //calculate the angle 
     float minutesRotation = (float)Math.atan2(minuteDirectionY,minuteDirectionX); 
     minutesRotation = (float)(minutesRotation * 360/(2 * Math.PI)); 

     //do this because of flipped coord system 
     minutesRotation = minutesRotation-180; 

     //if less than 0 add 360 so the rotation is clockwise 
     if (minutesRotation < 0) 
     { 
      minutesRotation = (minutesRotation+360); 
     } 


     //hours rotation calculations 
     float hour = mCalendar.get(Calendar.HOUR); 
     float minutePercentOfHour = (minute/60.0f); 
     hour = hour+minutePercentOfHour; 

     float hourPivotX = mCenterX+hourOffsetX; 
     //because of flipped coord system we take the y remainder of the full width instead 
     float hourPivotY = mWidth - mCenterY - hourOffsetY; 

     //calculate target position 
     double hourTargetX = mCenterX + mRadius * Math.cos(ConvertToRadians(hour * 30)); 
     double hourTargetY = mCenterY + mRadius * Math.sin(ConvertToRadians(hour * 30)); 

     //calculate the direction vector from the hand's pivot to the target 
     double hourDirectionX = hourTargetX - hourPivotX; 
     double hourDirectionY = hourTargetY - hourPivotY; 

     //calculate the angle 
     float hoursRotation = (float)Math.atan2(hourDirectionY,hourDirectionX); 
     hoursRotation = (float)(hoursRotation * 360/(2 * Math.PI)); 

     //do this because of flipped coord system 
     hoursRotation = hoursRotation-180; 

     //if less than 0 add 360 so the rotation is clockwise 
     if (hoursRotation < 0) 
     { 
      hoursRotation = (hoursRotation+360); 
     } 

Cela a également inclus une petite fonction d'aide:

public double ConvertToRadians(double angle) 
{ 
    return (Math.PI/180) * angle; 
} 

Merci pour votre aide tout

+0

Où puis-je obtenir minuteOffsetX et minuteOffsetY? Ou pouvez-vous nous donner la fonction complète onDraw? –

+1

Les 2 décalages sont la quantité en pixels du centre. Par défaut, les deux mains seraient à 0,0 – doodlleus

+0

Merci ... et le mRadius? –

0

Calculez simplement l'angle en fonction du vecteur directionnel.

D'abord, calculez la position cible. Pour l'aiguille des minutes, cela pourrait être:

targetX = radius * sin(2 * Pi/60 * minutes) 
targetY = radius * cos(2 * Pi/60 * minutes) 

calcule ensuite le vecteur de direction du pivot de la main à la cible:

directionX = targetX - pivotX 
directionY = targetY - pivotY 

Et calculer l'angle:

angle = atan2(directionX, directionY)