Java Math класс и его методы
В данной статье мы проведем краткий обзор класса Math в Java. Поговорим о методах данного класса и о том, как их использовать. Класс Math располагается в пакете java.lang и предоставляет набор статических методов для осуществления ряда различных математических вычислений. Ниже приведены примеры вычислений, для которых класс Math может оказаться полезным:
- Вычисление абсолютных значений (значений по модулю)
- Вычисление значений тригонометрических функций (синусов, косинусов и т.д.)
- Возведение в различные степени
- Извлечение корней различных степеней
- Генерация случайных чисел
- Округления
- И пр.
Ниже мы попробуем рассмотреть как класс Java Math помогает решать задачи, перечисленные выше.Начнем разбор класса с методов, которые позволяют вычислить значение по модулю. За это отвечает метод abs. Данный метод перегружен и в классе Math имеются следующие его различия:
- static double abs(double a)
- static float abs(float a)
- static int abs(int a)
- static long abs(long a)
Пример использования:
public static void main(String[] args) < System.out.println(Math.abs(-1)); // 1 System.out.println(Math.abs(-21.8d)); // 21.8 System.out.println(Math.abs(4532L)); // 4532 System.out.println(Math.abs(5.341f)); // 5.341 >
Вычисление значений тригонометрических функций
- static double sin(double a)
- static double cos(double a)
- static double tan(double a)
- static double asin(double a)
- static double acos(double a)
- static double atan(double a)
- static double toDegrees(double angrad)
- static double toRadians(double angdeg)
public static void main(String[] args)
0.0 0.49999999999999994 1.0 1.0 0.8660254037844387 6.123233995736766E-17
Что не совсем соответствует таблицам синусов и косинусов, отчасти благодаря погрешностям при переводе из градусов в радианы.
Возведение в степень
Для возведения числа в степень класс Math предоставляет метод pow, который имеет следующую сигнатуру:
static double pow(double a, double b)
public static void main(String[] args) < System.out.println(Math.pow(1,2)); // 1.0 System.out.println(Math.pow(2,2)); // 4.0 System.out.println(Math.pow(3,2)); // 9.0 System.out.println(Math.pow(4,2)); // 16.0 System.out.println(Math.pow(5,2)); // 25.0 System.out.println(Math.pow(1,3)); // 1.0 System.out.println(Math.pow(2,3)); // 8.0 System.out.println(Math.pow(3,3)); // 27.0 System.out.println(Math.pow(4,3)); // 64.0 System.out.println(Math.pow(5,3)); // 125.0 >
Извлечение корней
public static void main(String[] args) < System.out.println(Math.sqrt(4)); // 2.0 System.out.println(Math.sqrt(9)); // 3.0 System.out.println(Math.sqrt(16)); // 4.0 System.out.println(Math.cbrt(8)); // 2.0 System.out.println(Math.cbrt(27)); // 3.0 System.out.println(Math.cbrt(125)); // 5.0 >
Генерация случайных чисел
Для генерации случайных чисел класс Math предоставляет метод random. Данный метод генерирует случайное позитивное вещественное (double) число в промежутке от 0.0 до 1.0. Сигнатура метода имеет следующий вид:
public static double random()
public static void main(String[] args) < for (int i = 0; i < 5; i++) < System.out.println(Math.random()); >>
0.37057465028778513 0.2516253742011597 0.9315649439611121 0.6346725713527239 0.7442959932755443
С помощью небольших манипуляций, можно использовать метод random класса Math для получения целочисленных случайных чисел лежащих в определенном диапазоне. Приведем пример функции которая принимает два аргумента min и max и возвращает случайное целое число, которое лежит в промежутке от min (включительно) до max (включительно):
static int randomInARange(int min, int max)
public class MathExample < public static void main(String[] args) < // Карта, в которой мы будем хранить количество выпадений какого-то числа Mapmap = new TreeMap<>(); // За 10000 операций for (int i = 0; i < 10000; i++) < // Сгенерируем рандомное число от -10 включительно до 10 включительно final Integer randomNumber = randomInARange(-10, 10); if (!map.containsKey(randomNumber)) < // Если карта еще не содержит "выпавшего случайного числа" // Положим его в карту с кол-вом выпадений = 1 map.put(randomNumber, 1); >else < // Иначе, увеличим количество выпадений данного числа на 1 map.put(randomNumber, map.get(randomNumber) + 1); >> // Выведем на экран содержимое карты в формате ключ=[значение] for (Map.Entry entry : map.entrySet()) < System.out.println(String.format("%d=[%d]", entry.getKey(), entry.getValue())); >> static int randomInARange(int min, int max) < return (int) (Math.random() * ((max - min) + 1)) + min; >>
-10=[482] -9=[495] -8=[472] -7=[514] -6=[457] -5=[465] -4=[486] -3=[500] -2=[490] -1=[466] 0=[458] 1=[488] 2=[461] 3=[470] 4=[464] 5=[463] 6=[484] 7=[479] 8=[459] 9=[503] 10=[444] Process finished with exit code 0
Округление
- static long round(double a)
- static int round(float a)
- static double floor(double a)
- static double ceil(double a)
public static void main(String[] args) < System.out.println(Math.round(1.3)); // 1 System.out.println(Math.round(1.4)); // 1 System.out.println(Math.round(1.5)); // 2 System.out.println(Math.round(1.6)); // 2 System.out.println(Math.floor(1.3)); // 1.0 System.out.println(Math.floor(1.4)); // 1.0 System.out.println(Math.floor(1.5)); // 1.0 System.out.println(Math.floor(1.6)); // 1.0 System.out.println(Math.ceil(1.3)); // 2.0 System.out.println(Math.ceil(1.4)); // 2.0 System.out.println(Math.ceil(1.5)); // 2.0 System.out.println(Math.ceil(1.6)); // 2.0 >
Заключение
- Вычислять значения по модулю;
- Вычислять значения тригонометрических функций;
- Возводить числа в степень;
- Извлекать квадратный и кубический корни;
- Генерировать случайные числа;
- Округлять числа.
Как найти угол по часовой стрелке в градусах между двумя векторами в java
Сначала я хочу назвать этот следующий вектор как: Вектор M1 = [O → M1]; Вектор C1 = [O → E]; Вектор М2 = [А → М2]; Вектор C2 = [A → C]; Вектор M3 = [B → M3]; Вектор C3 = [B → G]; каждый вектор M является основным вектором или базовым вектором. Моя проблема в том, как найти угол между этими векторами (от M до C). чтобы решить, в каком направлении смотрел С по сравнению с М. e.g. 1.) Направление M1 и C1 правильное. 2.) Направление M2 и C2 левое. 3.) Направление M3 и C3 возвращается. пс. извините за мой плохой английский, если вы не понимаете, что я пытаюсь сказать, спросите меня. Отредактировано: угол должен быть по часовой стрелке.
Да, я знаю, что это было сложно, я нашел 2 способа сделать это, но с большей производительностью. Math.toDegrees(Math.atan2(V1.getZ(), V1.getX()) — Math.atan2(V2.getZ(), V2.getX())) и многое другое. — person Zen3515   schedule 12.05.2014
Я не понимаю. Если ab = |a||b|cos(theta), то если у вас есть два вектора, найдите их скалярное произведение ab (сумму произведений координат), разделите на произведение их длин |a||b|, возьмите Math. acos результата, за которым следует Math.toDegrees. Или я неправильно понимаю вопрос? — person Oleg Sklyar   schedule 12.05.2014
Мне нужен угол между двумя векторами по часовой стрелке. — person Zen3515   schedule 12.05.2014
Угол между векторами
Java LWJGL3.2.3 OpenGL
1.Есть два единичных вектора вектор1 и вектор2. Как найти угол между ними в радианах по осям x,y,z?
2.Формула предполагает
cos α =a·b /|a|·|b|
как в Java вычислить модуль вектора Vector3f?
3. Как получить Quaternionf для поворота на основе этого? Нужно ли устанавливать кватернион для каждой оси а потом перемножать их?
Java. Найти скалярное произведение и угол между двумя векторами (подпрограммы)
Доброго времени суток! Моя задача состоит в том, чтобы в двух подпрограммах найти скалярное.
Вычисление векторного произведения и вычисления угла между векторами
написать программу для вычисления векторного произведения и вычисления угла между векторами
Угол между лучами. Угол между векторами. Решение треугольника.
1. Найдите угол между лучом ОД и положительной полуосью OX , если Д(-2;2). 2. Решите треугольник.
Сообщение было отмечено EugeneV как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Vector3f v1 = new Vector3f(4, 0, 0); System.out.println("v1: " + v1); System.out.println("Length: " + v1.length()); Vector3f vn = new Vector3f(); v1.normalize(vn); System.out.println("vn: " + vn); System.out.println("Length: " + vn.length()); Vector3f vn2 = new Vector3f(0, 1, 0); System.out.println("vn2: " + vn2); System.out.println("Length: " + vn2.length()); Vector3f v2 = new Vector3f(0, 5, 0); System.out.println("v2: " + v2); System.out.println("Length: " + v2.length()); System.out.println("Angle (vn, vn2): " + Math.toDegrees(vn.angle(vn2))); System.out.println("Angle (v1, v2): " + Math.toDegrees(v1.angle(v2))); System.out.println("Cos (vn, vn2): " + vn.dot(vn2)); System.out.println("Arccos (vn, vn2): " + Math.toDegrees(Math.acos(vn.dot(vn2))));
Если вектора единичные (то есть нормализованы), то их длины равны 1. Нормализация это метод .normalize() а нахождение длины метод .length() оба метода есть у всех векторов (Vector2f, Vector3f, Vector4f и тд). В числителе дроби стоит скалярное произведение векторов, метод .dot(vec in) возвращает число, но есть еще готовый метод который находит угол между векторами .angle(vec in) который тоже возвращает число, равное углу между векторами в радианах
С кватернионами не сталкивался и нету жедания в них влезать, мне и углов Эйлера хватает, а вообще для поворота стоит использовать матрицы поворота, желательно в шейдерах, передавая в них матрицу модели. А в программе работать с моделью в локальных ее координатах