У меня проблемы с определением структуры класса, которая будет использоваться для хранения информации о цветах RGB / RGBA.
Я создаю очень простой движок для 3D-игр для развлечения и оттачивания моего OO-способности программирования.
Я бы хотел, чтобы мой движок поддерживал цвета RGB и RGBA.Кроме того, мне бы хотелось, чтобы значения RGB и RGBA можно было указывать как плавающие числа с ограничением на [0, 1] или беззнаковые символы.Я подумал, что для целей хранения было бы лучше использовать неподписанные символы, поскольку они используют в четыре раза больше памяти, чем числа с плавающей запятой.
Итак, теперь я разработал следующие классы, чтобы использовать для этого: Color, Color3,Color3f, Color3c, Color4, Color4f и Color4c.Color является суперклассом Color3 и Color4, в то время как Color3 является суперклассом Color3f и Color3c, так как Color4 с Color4f и Color4c.
Этот подход выглядит гораздо более сложным, чем необходимо.Я также немного подумал об использовании дженериков, поэтому вместо Color3f и Color3c можно было бы использовать Color3 и Color3,Тем не менее, этот подход тоже не показался правильным.
В идеале я хотел бы иметь возможность написать код, подобный следующему:
Color3 red1(255, 0, 0);
Color3 red2(1.0f, 0.0f, 0.0f);
Color* someColor = new Color3(1.0f, 0.0f, 0.5f);
Color4 anotherColor = *someColor;
Color4 thisColor = anotherColor.toChar();
//thisColor.r = 255, thisColor.g = 0, thisColor.b = 127
thisColor = thisColor.toFloat();
//thisColor.r = 1.0f, thisColor.g = 0.0f, thisColor.b = 0.5f
Теперь это не может быть реализовано (по крайней мере, длямои знания) в C ++, но как я могу собрать ту же функциональность, не создавая 7 отдельных классов?И без хранения потраченной информации?Например, изображение 1024x1024 в памяти.Это был бы массив с более чем миллионом этих цветов, так как я могу сделать иерархию классов Color гибкой и многократно используемой?то есть хранить значения RGB и RGBA в разных структурах с помощью неподписанных символов, но предоставлять функции для получения значений с плавающей запятой?
Извините, если это недостаточно конкретно, или что, это мой первый вопрос!Дайте мне знать, что еще будет полезно.Я могу опубликовать код того, что я пробовал до сих пор, если вы, ребята, предпочли бы, но, надеюсь, вы понимаете, чего я пытаюсь достичь.