
10.03.2015, 03:39
|
|
Регистрация: Mar 2015
Сообщений: 23
|
Вращение рукоятки (количество оборотов)
Доброго времени суток!
Стала задача сделать многооборотную рукоятку, которую можно вращать мышкой (вокруг своей оси). Саму по себе рукоятку сделал, вращается, но чтот никак не могу понять, как считать обороты, наткнулся на такой подводный камень: - во время вращения, угол вращения (в моем случае это значение Т4) перескакивает хаотично, бывают повторы одного и того же угла - в зависимости от того, на сколько плавно вести мышкой. Следовательно невозможно отследить точный угол (значение Т4), при котором программа поймет, что произошел полный оборот. Например, я указал, что если значение == 100, то оборот ++, но можно так вращать, что значение 100 проскочит, да еще и если повращать по-диджейски, т.е. туда-сюда с небольшим углом, то счетчик поворотов будет считать лишь переходы с 99 на 100 и с 0 на 100, что не катит  Подскажите, как организовать что бы при вращении вне зависимости от скорости и плавности моя переменная T4 принимала все целые значения угла полного оборота. архив с флешкой и исходником encoder.rar
 Код AS3:
stop();
encoder.addEventListener(MouseEvent.MOUSE_DOWN, down_mouse); //слушаем нажатие мышкой на рукоятку
encoder.addEventListener(MouseEvent.MOUSE_UP, up_mouse); //слушаем отпускание мышки над рукояткой
encoder.addEventListener(MouseEvent.MOUSE_OUT, out_mouse); //слушаем уведения мышки с рукоятки
var angle: Number;
var start_angle: Number;
var oborot: Number = -1;
oborot_scr.text = "0";
function down_mouse(event: MouseEvent) {
encoder.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
var ex: Number = mouseX - encoder.x;
var ey: Number = mouseY - encoder.y;
start_angle = Math.atan2(ey, ex) * 180 / Math.PI;
}
function up_mouse(event: MouseEvent) {
encoder.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
}
function out_mouse(event: MouseEvent) {
encoder.removeEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
}
function moveHandler(event: MouseEvent) {
var dx: Number = mouseX - encoder.x;
var dy: Number = mouseY - encoder.y;
angle = (Math.atan2(dy, dx)) * 180 / Math.PI;
encoder.rotation += (angle - start_angle);
var T2: Number = encoder.rotation;
var T3: Number = Math.floor(T2);
//обратный ход
if (T3 <= 0) {
T3 = 180 + (180 + T3);
}
//делитель числа полного оборота
var T4: Number = Math.floor(100 * (T3 / 360));
// проход круга
if (T4 == 0) {
oborot++;
oborot_scr.text = "" + oborot;
}
deg_scr.text = "" + T4;
// коррекция угла для следующего хвата, что бы не прыгало
start_angle = angle;
}
|