Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,945
Записей в блоге: 2

Класс(?) "вектор 3"

21.09.2025, 22:49. Показов 4595. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Пример
C++
1
2
3
4
struct Vec3f {
 float x, y, z;
 ...
};
1. Использовать class или struct? Защищать доступ к (x, y, z) особого смысла не видно. С др стороны, полезных методов/операторов у вектора набегает немало, это не пассивные данные.

2. Так называемая "дуаль". Вообще-то "вектор" и "координата" - разные вещи/сущности, но выражаются одними и теми же данными. Стоит ли как-то пытаться подчеркнуть это различие? Напр
C++
1
using Coord3f Vec3f;
3. Что если понадобится вектор в double? Или вектор (x, y) или (x, y, z, w)? Стоит ли сразу заряжать наследование, вероятно темплейты? Или спокойно продублировать пару классов?

4. Какими реализациями вектора Вы пользуетесь и какая Вам нравится?

Спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.09.2025, 22:49
Ответы с готовыми решениями:

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов
Привет! Задача следующая. Нужно реализовать класс "вектор" с конструкторами, которые позволяют...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
На самом деле ничё фантастического я не прошу, ведь: template <class T> class matrix { ...

Базовый класс "Точка" и производный класс "Вектор"
Здравствуйте, помогите пожалуйста решить вот такую задачу, никогда с такими не сталкивался ((...

14
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,398
Записей в блоге: 2
21.09.2025, 23:16
Зачем городить свой велосипед? Есть же либы glm, cglm, Imath и другие
Я пользуюсь GLM
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
22.09.2025, 08:07
Ага. Еще темплэйты сделайте ))
Видел я такую кодовую базу. Почему то проект сутки компилился после любой модификации в заголовочном файле. ))

Для своих целей использую handmademath
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,945
Записей в блоге: 2
22.09.2025, 13:13  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
Есть же либы glm, cglm, Imath и другие
И этот список легко продолжить. Чего же они городят велосипеды? Почему не один класс "на всех"? И какую либу выбрать?
Цитата Сообщение от alecss131 Посмотреть сообщение
Зачем городить свой велосипед?
А почему нет? Здесь это ничем не чревато, можно потренироваться в проектировании "конкретных" классов.

Цитата Сообщение от Aledveu Посмотреть сообщение
Ага. Еще темплэйты сделайте ))
Ну вообще-то основания для темплейтов здесь налицо. Вот много используют и хвалят GLM. Если не ошибаюсь, там на темплейтах
Цитата Сообщение от Aledveu Посмотреть сообщение
Видел я такую кодовую базу. Почему то проект сутки компилился после любой модификации в заголовочном файле. ))
"Чужую корову легко охаять". Даже если сутки - класс "вектор" меняется редко, можно и пережить

Не по теме:

Пусть глуповатый вопрос, но все-таки: class или struct? В соседней теме это обсуждалось куда более оживленно, что изменилось? :)

0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
22.09.2025, 18:02
Как по мне то удобно когда вектор это объединение структур . Тогда можно делать так
Vec4.xyz= vec3
Vec3.r
Vec3.g
Vec3.b
И прочее как в Glsl.
0
Покинул чат.
1132 / 727 / 195
Регистрация: 30.03.2021
Сообщений: 2,379
22.09.2025, 21:44
Igor3D, можешь исходники посмотреть той либы, что больше нравится. Вот я смотрю QVector3d (из Qt)- там класс, у него единственное хранилище
C++ (Qt)
1
2
private:
    float v[3];
вокруг которого крутится галактика конструкторов, геттеросеттеров, перегруженных операторов и тд.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
22.09.2025, 22:04
кстати а как с++ относится к тому чтобы выделить память для массива классов а потом делать для этого массива что-нибудь
типа такого:

C++
1
memcpy(vk_gpu_staging_buffer , array_of_vector4 , sizeof( *array_of_vector4) * NumPoints );
ну явно не канон
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,945
Записей в блоге: 2
22.09.2025, 22:30  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
Как по мне то удобно когда вектор это объединение структур . Тогда можно делать так
Vec4.xyz= vec3
Vec3.r
Vec3.g
Vec3.b
И прочее как в Glsl.
Народная примета: "сделать как там" (по образцу) почти всегда неудачно. Надо все-таки действовать в стиле плюсов (а не GLSL)

Цитата Сообщение от Aledveu Посмотреть сообщение
кстати а как с++ относится к тому чтобы выделить память для массива классов а потом делать для этого массива что-нибудь
типа такого:
memcpy(vk_gpu_staging_buffer , array_of_vector4 , sizeof( *array_of_vector4) * NumPoints );
ну явно не канон
Ну memmove/memcpy никто не отменял, а в последнее время популярно "мувать", конструкторы перемещения и все такое.
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
22.09.2025, 22:45
Цитата Сообщение от Igor3D Посмотреть сообщение
Народная примета: "сделать как там" (по образцу) почти всегда неудачно. Надо все-таки действовать в стиле плюсов (а не GLSL)
ну стиль плюсов постояно меняется - через 10 лет будут говорить что то что сейчас делают это не комильфо ))
а вот что касается сделать сам - ну как бы остальные библиотеки тоже кто-то сделал сам.

если человек настолько неумеет программировать что не может разобраться и поправить/доделать/переделать под себя/и пр. то тогда может ему и программировать не надо - это же будет очередная "самоделка" ))
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6228 / 2929 / 1047
Регистрация: 01.06.2021
Сообщений: 10,856
24.09.2025, 11:53
Цитата Сообщение от Igor3D Посмотреть сообщение
Использовать class или struct?
вообще, кто как хочет, так и делает. Например, в SFML используется шаблонный класс: https://www.sfml-dev.org/docum... ource.html Разрабы SFML вообще всегда пытаются писать на современном С++, в отличие от вышеприведенных исторических библиотек, написанных сишниками.

в Godot (C++) используются структуры. Кстати, код Godot открыт, так что можно оттуда, например, взять реализации многих математических функций, в том числе для работы с векторами.
Почему советую именно сорцы годот, потому что они написаны по-человечески, очень понятно. Оттуда можно прям просто скопировать и вставить в свой код. Вот в тех же вышеприведенных библиотеках glm в сорцах творится порнография. Бессмысленные перенаправления хидеров, коды написаны в не самом хорошем стиле для С++.

в Unity (C#) векторы тоже представлены как структуры.

в Unreal Engine (C++) тоже используются структуры.

То есть, API игровых движков предпочитают структуры для векторов.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,945
Записей в блоге: 2
24.09.2025, 16:30  [ТС]
Цитата Сообщение от Royal_X Посмотреть сообщение
Почему советую именно сорцы годот,
У меня нет проблем типа "откуда взять этот класс", думаю что ни у кого их нет, выбор очень широкий. Хотелось поговорить о том "как надо", какой путь лучший.
Цитата Сообщение от Royal_X Посмотреть сообщение
Например, в SFML используется шаблонный класс: https://www.sfml-dev.org/docum... ource.html Разрабы SFML вообще всегда пытаются писать на современном С++
Да, выглядит чисто, аккуратно. Правда этот класс "никуда не лезет", реализовано только самое простое/очевидное. Соображения

1. Все-таки темплейт, ну да, без вектора double не обойтись.

2. Все-таки члены public, лично я согласен. Десяток геттеров/сеттеров (как в Qt: x(), setX(), rx() и.т.п.) по-моему лишь засоряют текст.

3. Может dot и cross лучше реализовать не членами класса, а операторами и внешними ф-циями, возможно static, напр
C++
1
2
3
4
5
auto dotV = v1 * v2;
auto crossV = v1 | v2;
 
auto dotV2 = dot(v1, v2);  // Vec3f::dot ?
auto crossV2 = cross(v1, v2);
4. Нужен (пусть и нечасто) метод возвращающий ссылку на компонент по индексу, напр
C++
1
T & Component( size_t idx ) { return *(&x + idx); }
5. Все проблемы точности авторы SFML успешно спихнули на юзера, придется рисовать как-то так
C++
1
2
3
4
auto len2 = v1.lengthSquared();
if (len2 >= FLOAT_EPLILON2) 
 v1 /= sqrt(len2);
else {
И таких мест немало, хотелось бы каких-то удобств

6. Опять точность. Проблематичное "fuzzy" сравнение, мол, для бОльших чисел разрешается бОльшая разница. В Qt это есть, но как-то не вдохновляет, насколько помню
C++
1
qFuzzyCompare(100.0f, 100.1f);  // возвращает true, но разве эти значения так близки?
7. Как будет проистекать общение с vec4, который довольно популярен? Подозреваю что "сделать как в GLSL" не выйдет

В общем, все зависит от желания копать
0
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
24.09.2025, 16:53
Цитата Сообщение от Igor3D Посмотреть сообщение
Все-таки темплейт, ну да, без вектора double не обойтись.
и как тогда оптимизировать через simd ? только положиться на возможности компилятора - что он поймёт и все сделат правильно.

кстати я например очень против перегрузки операторов.
ибо есть векторное произведение, скалярное; vec4 например - это не только вектор, но и кватернион и плоскость и цвет для 3д графики и даже привязка точки к 4-м костям скелета для анимации.

кстати - а зачем double? как по мне - только если вы CAD делаете. и то сомнительно. для визуализации хватит и float а для сложных пространственных расчётов - нет смысла их в реалтайме делать.
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,945
Записей в блоге: 2
25.09.2025, 19:16  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
и как тогда оптимизировать через simd ? только положиться на возможности компилятора - что он поймёт и все сделат правильно.
А Вы полагаете что без double можно отделаться опциями компилятора? Думаю что нет, вот как это выглядит (впечатлительным лучше не смотреть). Затачивать на simd - это другая, специфичная задача

Цитата Сообщение от Aledveu Посмотреть сообщение
кстати я например очень против перегрузки операторов.
ибо есть векторное произведение, скалярное;
Ну есть, и что, чем плохо их перегружать?

Цитата Сообщение от Aledveu Посмотреть сообщение
vec4 например - это не только вектор, но и кватернион и плоскость и цвет для 3д графики и даже привязка точки к 4-м костям скелета для анимации.
Понятно что "не только ценный мех". Но стоит ли обходиться для всего одним vec4? Не лучше ли напр для кватерниона и цвета нарисовать свои классы с осмысленными методами? Да, пусть формально у всех данные 4 флота, какие-то методы придется дублировать, но это затраты мизерные
0
Модератор
Эксперт Java
 Аватар для alecss131
2867 / 1373 / 409
Регистрация: 11.08.2017
Сообщений: 4,398
Записей в блоге: 2
25.09.2025, 21:18
Цитата Сообщение от Igor3D Посмотреть сообщение
вот как это выглядит (впечатлительным лучше не смотреть)
Если на то пошло то стоит взглянуть на исходники и используемой во всех крупных движках PhysX, хотя там в отдельных репозиториях 3, 4 и 5 версии
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,945
Записей в блоге: 2
26.09.2025, 14:41  [ТС]
Цитата Сообщение от alecss131 Посмотреть сообщение
Если на то пошло то стоит взглянуть на исходники и используемой во всех крупных движках PhysX, хотя там в отдельных репозиториях 3, 4 и 5 версии
Чем он там такой "крупный"? Никаких следов simd там не видно. Что за PX_CUDA_CALLABLE, понятно "чтобы вызывать из CUDA", интересны детали. Опять template, есть полезный normalizeSafe
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.09.2025, 14:41
Помогаю со студенческими работами здесь

Создать класс, полем которого является класс вектор
как это выглядит?

Передать вектор в класс (интерфейсный класс по сути)
примером пока вопрос приложить не смогу - т.к. не знаю, как сделать... видела: Работа с классами ...

Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы
Помогите не знаю как сделать! Создать иерархию классов вектор(longint) и безопасный вектор с...

Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы. Безопасный...

контейнер -вектор вложеный в вектор
Помогите, пожалуйста найти ошибку. Есть строка типа string - обычное предложение из слов,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru