Программирование приложений на android
Создана: 31 Октября 2011 Пон 13:25:33.
Раздел: "Компьютерный раздел"
Сообщений в теме: 223, просмотров: 34959
-
То есть мне телефон надо менять получается? -
обсуждая везде крестики-нолики, вы рискуете так и остаться человеком, о котором никто и не вспомнит потом. Вы действительно хотите делать бесполезные вещи или все же хотите сделать что-то, что поможет миллионам людей во всем мире? -
В качестве углов будем использовать четыре величины
angle - угол между лучом и осью Х в относительных единицах, равных угол/15
alpha - угол между лучом и осью Х в градусах
mAng - угол между зеркалом и осью Х в относительных единицах, равных угол/15
alpha - угол между зеркалом и осью Х в градусах
При вычислении тригонометрических функций в качестве аргументов будем использовать величины alpha и beta
Для того чтобы избежать невычислимых значений функций заменим соответствующие аргументы на близкие
Код: switch (angle) {
case 0: alpha = 359.9;
break;
case 6: alpha = 89.9;
break;
case 12: alpha = 179.9;
break;
case 18: alpha = 269.9;
};
switch (mAng) {
case 0: beta = 359.9;
break;
case 6: beta = 89.9;
break;
case 12: beta = 179.9;
break;
case 18: beta = 269.9;
};
Для случая когда луч лазера параллелен зеркалу нужно определить расстояние между зеркалом и лучом в центре ячейки которой располагается зеркало. Если расстояние больше толщины зеркала, то взаимодействия между лучом и зеркалом не происходит. Если не превышает то луч поглощается зеркалом так как он падает на неотражающую торцевую поверхность зеркала.
x=a1 + ctg alpha * y0
delta_x = x0-x
где x0, y0 координаты центра ячейки
Допустим толщина зеркала равна 3, тогда
а) Если delta_x <= 3 то построение луча законченно и конечная точка луча совпадает с центром ячейки
б) Если delta_x > 3 то продолжаем построение луча и никаких событий в текущей ячейке не происходит
Случай параллельности луча лазера и зеркала определяется по абсолютной величине разности углов angle и mAng
Math.abs(angle - mAng) == 12 | Math.abs(angle - mAng) == 0 -
Сначала формулу вывел, а потом до меня дошел смысл формулы
Отраженный луч будет симметричен падающему относительно оси зеркала. Получается для отраженного угла формула универсальная
b = 360 - a
а - угол между падающим лучом и осью зеркала. b - угол между отраженным лучом и осью зеркала. -
Исследуем третий случай (вариант).
1. Сначала вычисляем точку падения луча на зеркало. Находим координату Y
y = (a2 - a1)/(ctg alpha - ctg beta)
Потом координату X
x = a1 + y * ctg alpha
2. Теперь нужно определить находится ли точка падения луча на линию зеркала в текущей ячейке
x0 - 32 <= x < x0 + 32
y0 - 32 <= y < y0 + 32
3. Если точка паденияя находится в текущей ячейке, то вычисляем угол отраженного луча
с = 360 - a + b
a - угол между падающим лучом и осью Х
b - угол между осью зеркала и осью Х -
-
Вот сюжет - Перемещение картинки вдоль произвольной кривой
[внешняя ссылка]
Интересно сделать так чтобы санки ускорялись когда едут вниз и замедлялись при подъеме -
Постановка : Делим кривую на 1000 отрезков одинаковой длины.
Начальные условия : Скорость равна 10 отрезков за кадр мультипликации
Для того чтобы вычислить путь пройденный в следующий момент времени надо вычислить скорость. Момент времени это один кадр мультипликации.
Скорость вычисляем по формуле v = v0 + a*t^2/2
t = 1 кадр
v = v0 + a/2 , где v0 - скорость в предыдущий момент времени
Надо найти a
a*m = m*g*cos(alpha) - k1*v - k2*v^2
g - ускорение свободного падения, m - единица, k1 = 0.1, k2 = 0.1, alpha - угол между вектором силы тяжести и касательной к кривой в данной точке. Вектор силы тяжести совпадает с осью Y android -
Пусть плоская кривая по которой движется тело имеет координаты x, y на плоскости и координату z равную расстоянию от точки до начальной точки кривой.
Если скорость положительна, то движение происходит в сторону увеличения координаты z.
Вектор касательной к кривой совпадает по направлению с вектором положительной скорости в точке
В методе getPosTan класса PathMeasure в качестве третьего аргумента используется массив из двух элементов, в которые метод помещает x и y координату касательной в заданной точке.
Для расчета проекции силы тяжести на вектор движения надо вычислить косинус угла между осью Y (совпадающей с вектором силы тяжести) и вектором касательной к точке.
Длина вектора касательной равна единице. Косинус равен проекции вектора на ось Y.
Если записать
pm = new PathMeasure(ptCurve, false);
float afP[] = {0f, 0f};
float at[] = {0f, 0f};
pm.getPosTan(fSegmentLen * iCurStep, afP , at);
то at[1] как раз содержит проекцию вектора касательной на ось Y. Тогда получим
F = m*g*at[1] - k1*v - k2*v^2