отскакивание от прямых

195
09 января 2018, 14:27

В декартовом пространстве точка движется по прямой под определённым углом к другой прямой, надо определить направление движения после столкновения с этой прямой. Помогите найти ошибку в коде. Мне кажется что у меня ошибка на этапе вращения в одну или другую сторону, но по факту может быть допущена и раньше.

/**
 * Расчёт нового угола
 * @param thisX1 исходные координаты точки по X
 * @param thisY1 исходные координаты точки по Y
 * @param thisX2 возможная новая точка по X 
 * @param thisY2 возможная новая точка по Y
 * @param XY     координаты пересечения исходной точки по линии движения с линие, координаты которой ниже
 * @param lineX1 начало линии по X
 * @param lineY1 начало линии по Y
 * @param lineX2 конец линии по X
 * @param lineY2 конец линии по Y
 * @param angle исходный угол
 * @return итоговый угол
 */
private double newAngle(float thisX1, float thisY1, float thisX2, float thisY2, float XY[], float lineX1, float lineY1, float lineX2, float lineY2, double angle) {
    float thisA = thisY1 - thisY2, thisB = thisX2 - thisX1, thisC = thisX1 * thisY2 - thisX2 * thisY1, // коэфф прямйо движения исходной точки
          lineA = lineY1 - lineY2, lineB = lineX2 - lineX1, lineC = lineX1 * lineY2 - lineX2 * lineY1, // коэфф прямой с которой произошло пересечение
          resLineB = lineA, resLineA = -lineB, resLineC = (-1) * lineA * XY[1] + lineB * XY[1];// перепендикулярная прямая
    double angleLines = Geometric_Calculate.angleLines(thisA, thisB, resLineA, resLineB); // угол между прямыми
    if (angleLines > Math.PI / 2) // удастоверяюсь что он меньше 90
        angleLines = Math.PI - angleLines;
    double invertAngle = Math.atan2(thisY1 - thisY1 + Math.sin(angle), thisX1 - Math.cos(angle) - thisX1) * (-1); // инвертирую его (вычисляю точку поворота угла по окружности в противоположном направлении)
    float myBeNewX = thisX1 + (float) Math.cos(invertAngle + 2 * (angleLines)), // новые возможные координаты
          myBeNewY = thisY1 + (float) Math.sin(invertAngle + 2 * (angleLines));
    double angleLines2 = Geometric_Calculate.angleLines(thisY1 - myBeNewY, myBeNewX - thisX1, resLineA, resLineB); // угол между получившимися прямыми
    if (angleLines2 > Math.PI / 2)
        angleLines2 = Math.PI - angleLines2;
    // 2 проверки
    // 1: смотрю если угол между новой прямой меньше исходного (мы ближе к перпендикуляру)
    // 2: смотрю пересечение новой возможной точки с прямой (это проверка не всегда срабатывает)
    if (angleLines2 < angleLines && !Geometric_Calculate.interesectionLinesBool(thisX1, thisY1 , thisX1 + 2 * (float) Math.cos(invertAngle + 2 * (angleLines)), thisY1 + 2 * (float) Math.sin(invertAngle + 2 * (angleLines)), lineX1, lineY1, lineX2, lineY2))
        angle = invertAngle + 2 * (angleLines);
    else
        angle = invertAngle - 2 * (angleLines);
    return angle;
}
// через косинусы
public static double angleLines(float a1, float b1, float a2, float b2) {
    double angle = Math.acos(Math.abs(a1 * a2 + b1 * b2) / (Math.sqrt(a1*a1 + b1*b1) * Math.sqrt(a2*a2 + b2*b2)));
    if (angle > Math.PI)
        return Math.PI * 2 - angle;
    else
        return angle;
}
READ ALSO
Нажатие клавиш в java

Нажатие клавиш в java

Как можно реализовать нажатие клавиш на Java? Чтобы можно было набирать текст и тд

186
Вывод массива в cardview

Вывод массива в cardview

Получаю данные из JSON страницы, записываю их в массив, при выводе в cardview ничего не выводит (белый экран)Смотрю по logcat данные в массиве есть

221
unit тестирование

unit тестирование

Как бы Вы протестировали данный метод?

170