Pull to refresh

Comments 20

Вопрос по теме, но к сообществу. Увидел класс Point2D отсюда и вопрос, т.к. использую для этих целей имя «Vector»:

Как правильно именовать точки в пространстве — с помощью класса Point или с помощью Vector. По факту ведь реализация (методы и поля) у них одинаковая совершенно, так ведь?
По факту ведь реализация (методы и поля) у них одинаковая совершенно, так ведь?

Вы рассуждаете опираясь на реализацию, а не на интерфейсы. Важно то, что вы работаете с точками, а не векторами. Поэтому быдут логично использовать объекты Point, а не Vector. Но это, на мой взгляд, больше идеалогический вопрос.
Семантику я сейчас опускаю, интересуют подводные камни и общепринятость использования объекта вектора как точки.

В любом случае всегда можно написать class Point2 extends Vector2 {}.
Точка подразумевает, что она описывается вектором, опирающимся на начало выбранной системы координат (0; 0).
Идея вектора не подразумевает фиксированного начала. Вектор как «смещение», оператор, который можно применить к чему угодно.

Вообразите себе время:
Есть «моментальный» тип, измеряемый в минутах-месяцах от фиксированного начала календаря. «Момент» с «моментом» не складывается, хотя можно найти разность моментов (это будут данные интервального типа).
Есть «интервальный» тип, измеряемый так же минутах-месяцах, но не имеющий привязки к фиксированному началу. Можно сложить интервал с интервалом, найти их разницу — в результате будут интервалы. Если сложить интервал с моментом, на выходе будет момент. Очевидно, что интервал сам по себе датой быть не может.
Но если брать реализации — я не видел, что бы вектор описывался двумя точками — Unreal Engine 4 (включая ThirdParty/Oculus/LibOVR и ThirdParty/nvTextureTools/nvTextureTools-2.0.6, может быть ещё что), Libgdx (com/badlogic/gdx/math/Vector3) и предполагаю что прочие по умолчанию подразумевают начало [0,0,0]. Из чего можно сделать вывод, что речь идёт опять же о семантических отличиях вектора от точки, а не отличиях в реализации. Вопрос был конкретно в верности использования реализации вектора, как точек для координатной сетки мешей, мира, экторов и прочего.
Так у вас и валюта в вещественном типе хранится, и даже масса тоже в вещественном. И хэндлеры в целочисленном, арифметически совместимом, например, со счётчиками.

Именно поэтому возникла «венгерская нотация» — предварять наименование переменной её бизнес-типом. Если верно пользоваться венгерской нотацией, то программисту становится яснее что масса+валюта=неудачная мысль, даже если компилятор ошибок не выдает.

Повторяю:
момент + момент = операция бессмысленна
момент — момент = интервал
момент ± интервал = новый момент
интервал ± интервал = интервал
И:
точка + точка = операция бессмысленна
точка — точка = расстояние
точка ± расстояние = новая точка
расстояние ± расстояние = новое расстояние

Я не знаю объектной модели Java, но на вашем месте я бы внимательно читал документы на предмет именно такой «семантической» (я называю «бизнес», потому, что мало ли где ещё эта семантика) разницы между точкой и вектором.
В геометрии нет определения точки, но можно схитрить, «определив» точку как конец вектора (x,y,z)
Поясню на всякий случай. Можно говорить о взаимнооднозначном соответствии векторов и точек в пространстве, если задана некоторая начальная точка. Но в этом случае, каждой точке в пространстве можно поставить в соответствие набор из координат вектора, который соответствует этой точке. И эти числа будут однозначно определять точку, как определяют вектор.
Поясню на всякий случай.

https://pbs.twimg.com/media/CIbydaqWEAAgMmg.jpg

Если вам понадобились батарейки, вы что-то сделали не так.
Живая уточка тоже кушать требует. Точка и вектор вполне взаимозаменяемы как типы данных, всего лишь это хотел сказать.
Место и скорость тоже взаимозаменяемы как типы данных ;-)
Прошу прощение, но ведь уже есть класс java.awt.geom.Point2D, которые специально используются для всех подобных классов (например, точки в Line2D возвращаются в виде java.awt.geom.Point2D), зачем нужно вводить свои точки?

Тогда, если я не ошибаюсь, и необходимость в Branch отпала бы.
Класс Point2D, я взял из другого своего проекта. Дополнительно в нем были определен метод для вращения точки относительно оси координат. И ввиду того, что я еще не гуру в Java, стараюсь изобретать велосипеды, для получения дополнительной практики.
Отдельный класс Branch был заведен из соображений расширяемости. Например для каждой ветки можно сохранять цвет. В методе getShape можно отрисовывать не линию, а полигон.
Она была введена, условно говоря «с запасом». На данный момент используется для раскраски ветвей и «листьев», в разые цвета. Обратите внимание в классе PaintPanel, закомментированный участок кода:
if(b.length>30)
g2d.setColor(Color.ORANGE.darker());
else
g2d.setColor(Color.GREEN);

Всё, что длиннее 30 — темно-оранжевое, меньше — зелёный.
Хм… а не пробовали свернуть так:
g2d.setColor(b.length>30 ? Color.ORANGE.darker() : Color.GREEN);


Только тогда желательно будет выделить под Color.ORANGE.darker() отдельную переменную, что бы он не считался каждый раз.
Красивое решение. Спасибо, буду иметь в виду.
Сейчас мне кажется, лучшим решением, объявить переменную типа Color в классе Branch, и при создании определять цвет в зависимости от количества шагов рекурсии. Как вы считаете?
Мой английский желает желать лучшего. :( Можете вкратце рассказать о чем статья?
Sign up to leave a comment.

Articles