私には、理解できない興味深い数学の問題があります。
私はアンドロイドウェアのウォッチフェイスを構築しており、時間に基づいて針の回転角度を計算する必要があります。
通常、これは簡単なことですが、ここでキッカーがあります。針は時計の中心にありません。10,10 を測定する時計の文字盤があるとします。分針のピボット ポイントは 6,6 (左下が 0,0) にあり、短針は 4,4 にあります。
ポイントが常に正しい分を指すように、特定の分の角度をどのように計算しますか?
ありがとう
わかりました、ニコの答えの助けを借りて、微調整を行い、実際の例を得ることができました。
組み込む必要がある主な変更点は、atan 計算への入力の順序を変更することと、android が座標系を逆さまにすることを主張しているため、微調整を行うことでした。
以下の私のコードを見てください。
//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);
}
これには、小さなヘルパー関数も含まれていました。
public double ConvertToRadians(double angle)
{
return (Math.PI / 180) * angle;
}
助けてくれてありがとう
方向ベクトルに基づいて角度を計算するだけです。
まず、目標位置を計算します。分針の場合、これは次のようになります。
targetX = radius * sin(2 * Pi / 60 * minutes)
targetY = radius * cos(2 * Pi / 60 * minutes)
次に、手のピボットからターゲットへの方向ベクトルを計算します。
directionX = targetX - pivotX
directionY = targetY - pivotY
角度を計算します。
angle = atan2(directionX, directionY)