2015-03-14 2 views
2

Может ли кто-нибудь указать мне в правильном направлении, чтобы узнать, как писать выражения для вращения холста в студии Android. Я создаю часовую панель, и я использовал часть кода из предоставленного образца, но мне нужно понять, что это значит. Вот часть кода:Вращение растрового изображения на холсте в студии Android

float minuteRotation = time.minute/ 30f * (float) Math.PI 

Если это может быть переведено в фиктивных терминах, так что я могу понять, как они достигают этих значений.

+0

Это основной вопрос геометрии. Я предлагаю вам прочитать представление углов сегментов по кругу и длину дуги, представленную градусами, минутами и секундами. Главное, что вы не должны путать минуты и секунды в геометрии с используемыми во времени и, в частности, представлением на аналоговом часовом/часовом лице. Несмотря на то, что существует корреляция, круг в геометрии не обязательно представляет собой часовое/часовое лицо, но понятие минут и секунд по мере того, как деления степени все еще применяются. – Squonk

+0

См. Эту статью ... http://en.wikipedia.org/wiki/Degree_(angle) – Squonk

+0

Вы можете посмотреть код для моих «часов xkcd» здесь: https://github.com/jselbie/xkcdclock – selbie

ответ

1

Если вы посмотрите на единичный круг Math.PI находится с одной стороны, а 0 - с другой стороны, скажем 0 - время.minute/30 = 0 * Math.PI = 0 или если 30 - время .minute/30 * Math.PI = 1 * Math.PI = Math.PI ведьма другая сторона единичного круга так же, как часы

unit circle

0
canvas.save(); 
canvas.rotate(45); 
canvas.drawRect(166, 748, 314, 890, paint); 
canvas.restore(); 

, где 45 - это градусов

1

Ваш minuteRotation переменная представляет собой ANGLE, через который вам нужно повернуть холст в orde r, чтобы нарисовать минутную стрелку в правильном положении. В соответствии с API Android этот угол должен быть указан в Radians (не в градусах), поэтому используется значение «Math.PI».

PI радианы представляют собой ПОЛОВИНУ ПОЛНОГО ВРАЩЕНИЯ, то есть 180 градусов - половину круга. Он используется (в выражении, которое вы описали) просто как ФАКТОР СКОРОСТИ. Альтернативой (и яснее,) способ записи того же уравнения будет:

minuteRotation = (time.minute/ 60.0f) * (float) Math.PI * 2.0f 

Этот альтернативный вариант делает яснее смысл различных чисел:
- «60,0» представляет собой число с плавающей точкой, который представляет собой максимальное количество минут возможных (в полном обороте)
- «Math.PI * 2» радианах угловой эквивалент полного круга вращения (то есть 360 градусов)

фракции «time.minute/60,0», следовательно, представляет собой долю полного часа, который в настоящее время используется. Умножая это на выражение PI * 2, тогда выдается эквивалентная часть полного круга, выраженная как ANGLE (в Radians).

+0

Спасибо, что поняли, что и информация приближает меня к действительному пониманию, но когда я пытаюсь проверить ту же математику за час. В представленном образце я все время путаюсь. float minuteRotation = time.minute/30f * (float) Math.PI; float hourRotation = ((time.hour + time.minute/60f)/6f) * (float) Math.PI; float dateRotation = time.monthDay/15f * (float) Math.PI; float dowRotation = time.weekDay/35f * (float) Math.PI; float monthRotation = (time.month/12f) * (float) Math.PI; – skeete

+0

и где я могу найти значения для time.weekDay, time.monthDay и т. Д.? – skeete

+0

Хорошо. причина, по которой ** ** ** вычисление больше привлекает внимание, что ** минутное вычисление состоит в том, что минутная стрелка всегда перескакивает с отметки минус-галочки _whole_ на следующий галочный маркер _whole_ минут. Часовая стрелка, однако, медленно проходит медленно по маркерам, поэтому всякий раз, когда вы вычисляете положение часовой стрелки, вы всегда должны добавлять текущие минуты в виде доли часа. Эта фракция заставит часовую стрелку перемещаться между маркерами в соответствующее положение в своем непрерывном пути. Вот почему они используют выражение «(time.hour + time.minute/60f)» –