Все почалося з цього міксу:
Слухаючи його, я зрозумів, що мені потрібен новий контролер для RGB-світлодіодної стрічки. Подібні штуки, якщо хтось пам'ятає, мною вже делалался, однак чесного перетворення HSV -> RGB там не було - замість нього використовувався простий перебір квітів по Hue. Тепер же прийшло усвідомлення того, що мені конче необхідно чесне перетворення з усіх трьох компонент. 🙂
Я пішов гуглити, і не сказати, щоб мої пошуки були зовсім марні - я знайшов і формули, і деяка кількість реалізацій. Проблема полягала лише в тому, що і формули, і реалізації розраховані на плаваючу точку, а мене, зрозуміло, цікавила целочисленная арифметика. Реалізації в цілих числах, яка мене б влаштувала, я так і не знайшов.
Загалом, хочеш, щоб щось було зроблено добре - зроби це сам. Спочатку я хотів перетворити формулу. додавши в неї відповідні масштабуючі коефіцієнти, однак, промучившись деякий час, я плюнув на це заняття і просто переписав вихідну формулу на чесній фіксованій точці.
Нижче викладені листинги hsv2rgb.h і hsv2rgb.c - мені лінь завантажувати їх архівом.
Модуль містить як целочисленную (з фіксованою крапкою) реалізацію, так і реалізацію з плаваючою точкою. Їх компіляція включається незалежно відповідними дефайнамі. Бонусом йде власне реалізація операцій з фіксованою точкою.
fp_HSV2RGB (...) - реалізація з плаваючою точкою.
fxp_HSV2RGB (...) - реалізація з фіксованою точкою.