2013-12-16 4 views
1

Привет, Я сейчас работаю над небольшим проектом, и мне нужно добавить класс, который позволяет мне добавить 2 вектора вместе/вычесть их. Вектор, например, Vector (x, y, z)Лучший способ закодировать небольшой векторный класс Java 3d

Каков наилучший способ его кодирования? Я не хочу использовать класс из Интернета, потому что я думаю, что функциональность, в которой я нуждаюсь, действительно базовая.

Вот некоторые псевдокоды я думал: Вектор (х, у, г) является массивом с [0] = х [1] = у [2] = г Так что если мы имеем Vector1 (x1, y1, z1) и Vector 2 (x2, y2, z2), мы просто имеем 3D-массив, который в основном содержит [0] = x1 + x2 [1] = y1 + y2 и [2] = z1 + z2 Is что правильный путь?

+0

Для того чтобы это был хороший вопрос, вы должны дать нам предложение о том, как ** вы ** думаете, что вам следует это делать, например. –

+1

Напиши этот класс в Java, это ужасно: Java generics сосет и не имеет перегрузки оператора. Даже если вы используете java-путь (без операторов, «добавить» метод и коллег), единственный способ передачи функциональности в Java - это через интерфейсы, что делает невозможным добавление двух ints, например. – Manu343726

+0

[Посмотрите, пожалуйста, базовое программирование на пользовательских классах] (http://docs.oracle.com/javase/tutorial/java/javaOO/classes.html) – DoubleDouble

ответ

1

Если ваши векторы всегда в трех измерениях, я бы не пошел с массивом, это, вероятно, сделает вещи менее ясными. Попробуйте что-то вроде этого:

public class Vector { 
    private final double x; 
    private final double y; 
    private final double z; 

    public Vector(double x, double y, double z) { 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    } 

    // Getters... 

    public Vector add(Vector addend) { 
    return new Vector(x + addend.x, y + addend.y, z + addend.z); 
    } 

    // Other operations... 
} 

Как правило, лучше, чтобы сделать поля final, поэтому вы уверены, что ваши данные не удивительно изменить значение, потому что вы случайно общие ссылки с другой частью коды.

+1

Создание новых объектов - это просто отходы. Нет необходимости делать их окончательными, если они хорошо инкапсулированы. – Troubleshoot

+2

Я не согласен. Инкапсуляция не мешает вам иметь две ссылки на один и тот же экземпляр «Vector» в разных частях кода, а изменение одного приведет к неожиданному изменению другого. Я бы начал с этого подхода и пошел с изменчивостью только в случае * проверенных * проблем с производительностью. – Flavio

+0

Использование векторного класса обычно означает много векторных вычислений ** например ** игры. Например, если есть 120 вычислений на кадр, 60 кадров в секунду, то есть 7200 новых экземпляров в секунду, что дорого. Другая причина, по которой это плохая идея, заключается в том, что она не допускает цепочки методов, которая чрезвычайно полезна для векторных операций в java. vector.add (4, 3, 6) .divide (2) .sub (4, 2, 9) станет vector.add (4, 3, 6); vector.divide (2); vector.sub (4, 2, 9). – Troubleshoot

2

Просто храните каждый компонент в качестве переменной. Нет необходимости использовать массивы. Я просто напишу что-то простое:

public class Vector3 { 

    float x, y, z; // package-private variables; nice encapsulation if you place this in a maths package of something 

    Vector3(float x, float y, float z) { 
     this.x = x; 
     this.y = y; 
     this.z = z; 
    } 

    public Vector3 add(Vector3 vector) { 
     x += vector.x; 
     y += vector.y; 
     z += vector.z; 
     return this; // method chaining would be very useful 
    } 

} 
+0

В общем, более полезно кодировать такие классы, которые являются базовыми строительными блоками как * неизменные классы *. – Darkhogg

+0

@Darkhogg Единственный источник оптимизации производительности в моем опыте - это иметь изменяемые классы, чтобы я мог удалить выделение, сохранив временные классы, которые я использую снова в каждом кадре. –

+0

@ LennartRolland Если это для игры, в которой вам необходимо активно предотвращать работу GC, насколько это возможно, тогда да, это оптимизация, которую я бы тоже сделал. Тем не менее, * в целом *, это не так полезно, как вы думаете: распределение на Java почти мгновенно, ограничение производительности происходит только от GC, который является ДЕЙСТВИТЕЛЬНО быстрым для короткоживущих объектов, и не будет замечен в большинстве приложений, которые не Требуется (почти) производительность в реальном времени. – Darkhogg

Смежные вопросы