В декартовом пространстве точка движется по прямой под определённым углом к другой прямой, надо определить направление движения после столкновения с этой прямой. Помогите найти ошибку в коде. Мне кажется что у меня ошибка на этапе вращения в одну или другую сторону, но по факту может быть допущена и раньше.
/**
* Расчёт нового угола
* @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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Задача:
Как можно реализовать нажатие клавиш на Java? Чтобы можно было набирать текст и тд
Получаю данные из JSON страницы, записываю их в массив, при выводе в cardview ничего не выводит (белый экран)Смотрю по logcat данные в массиве есть