Задача. Написать класс для работы с геометрическими векторами на плоскости. Реализовать максимально возможное количество методов.
Определение. Вектор — это направленный отрезок, то есть отрезок, имеющий длину и определенное направление. Графически вектора изображаются в виде направленных отрезков прямой определенной длины.
Код программы:
Описание класса:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
class MyVector { private double x; private double y; public MyVector(double x, double y) { this.x = x; this.y = y; } public double vLength() { double tempLen = Math.sqrt(x*x + y*y); double newLen = new BigDecimal(tempLen).setScale(3, RoundingMode.UP).doubleValue(); return newLen; } public static MyVector sum(MyVector a, MyVector b) { return new MyVector(a.x + b.x, a.y + b.y); } public static MyVector sub(MyVector a, MyVector b) { return new MyVector(a.x - b.x, a.y - b.y); } public static MyVector mul(MyVector a, double c) { return new MyVector(a.x * c, a.y * c); } public static double scalar(MyVector a, MyVector b) { double tempScalar = a.x * b.x + a.y * b.y; double newScalar = new BigDecimal(tempScalar).setScale(3, RoundingMode.UP).doubleValue(); return newScalar; } public static double cos(MyVector a, MyVector b) { double tempCos = scalar(a, b) / (a.vLength() * b.vLength()); double newCos = new BigDecimal(tempCos).setScale(3, RoundingMode.UP).doubleValue(); return newCos; } public static double projection(MyVector a, MyVector b) { double tempProj = scalar(a, b) / b.vLength(); double newProj = new BigDecimal(tempProj).setScale(5, RoundingMode.UP).doubleValue(); return newProj; } public static boolean isCollinear(MyVector a, MyVector b) throws ArithmeticException { double eps = 0.0001; if (b.x == 0 || b.y == 0) { throw new ArithmeticException("Zero divider"); } return (Math.abs(a.x / b.x - a.y / b.y) < eps); } public static double vecProduct(MyVector a, MyVector b) { double tempProduct = a.vLength() * b.vLength() * Math.sqrt(1 - cos(a,b) * cos(a,b)); double newProduct = new BigDecimal(tempProduct).setScale(5, RoundingMode.UP).doubleValue(); return newProduct; } public String toString() { return new String(x + " ; " + y); } } |
Формулы
Длина вектора
[latex]|\vec{a}| = \sqrt{x^2+y^2}[/latex]
Умножения вектора на число
[latex]\lambda \vec{a} = \left\{ \lambda x; \lambda y \right\}[/latex]
Проекция вектора на вектор
[latex]{}_{\vec{b}}\vec{a} = \frac{\vec{a}\cdot\vec{b}}{|\vec{b}|}[/latex].
Основная программа
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Main { public static void main (String[] args) { MyVector a = new MyVector(10.1,-19); MyVector b = new MyVector(13,-2.09); System.out.println(a.vLength()); System.out.println(b.vLength()); System.out.println(MyVector.sum(a,b)); System.out.println(MyVector.sub(a,b)); System.out.println(MyVector.mul(a,8)); System.out.println(MyVector.scalar(a,b)); System.out.println(MyVector.cos(a,b)); System.out.println(MyVector.projection(a,b)); System.out.println(MyVector.isCollinear(a,b)); System.out.println(MyVector.vecProduct(a,b)); } } |
Ход выполнения
При выполнении происходит проверка функций класса: логических, арифметических, построения объектов, функции строкового отображения объекта.
Вывод программы
1 2 3 4 5 6 7 8 9 10 |
21.518 13.167 23.1 ; -21.09 -2.9000000000000004 ; -16.91 80.8 ; -152.0 171.01 0.604 12.98778 false 225.80758 |
Ссылки
Код программы на Ideone
— Добавьте, пожалуйста, векторное произведение.
— Вы забыли про javadoc.
Исправил
– Вы забыли про javadoc.