1

私には、理解できない興味深い数学の問題があります。

私はアンドロイドウェアのウォッチフェイスを構築しており、時間に基づいて針の回転角度を計算する必要があります。

通常、これは簡単なことですが、ここでキッカーがあります。針は時計の中心にありません。10,10 を測定する時計の文字盤があるとします。分針のピボット ポイントは 6,6 (左下が 0,0) にあり、短針は 4,4 にあります。

ポイントが常に正しい分を指すように、特定の分の角度をどのように計算しますか?

ありがとう

4

2 に答える 2

1

わかりました、ニコの答えの助けを借りて、微調整を行い、実際の例を得ることができました。

組み込む必要がある主な変更点は、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;
}

助けてくれてありがとう

于 2016-02-01T23:23:50.307 に答える
0

方向ベクトルに基づいて角度を計算するだけです。

まず、目標位置を計算します。分針の場合、これは次のようになります。

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

次に、手のピボットからターゲットへの方向ベクトルを計算します。

directionX = targetX - pivotX
directionY = targetY - pivotY

角度を計算します。

angle = atan2(directionX, directionY)
于 2016-02-01T18:37:38.860 に答える