Усреднение круговых значений (особенно оттенков в цветовой схеме HSL)

Поэтому я пытался понять, как рассчитать средний оттенок ряда объектов, цвета которых представлены значениями HSL. К счастью, я наткнулся этот пост переполнения стека, и приступить к работе, реализуя алгоритм, представленный в верхнем ответе (я работаю в C ++).

К сожалению, моя реализация, похоже, не работает. Вот оно, в полном объеме; обратите внимание, что, хотя я пишу «Оттенок», я использую углы в градусах в соответствии с первоначальной реализацией (переключение с 0–360 углов на 0–256 оттенков, если я знаю, что мой код работает, не должно быть трудным).

#include <iostream>
#include <vector>
#include <cmath>

#define PI (4*atan(1))

int main()
{
///
/// Calculations adapted from this source:
/// https://stackoverflow.com/questions/8169654/how-to-calculate-mean-and-standard-deviation-for-hue-values-from-0-to-360

std::vector<double> Hues = {355, 5, 5, 5, 5};

//These will be used to store the sum of the angles
double X = 0.0;
double Y = 0.0;

//Loop through all H values
for (int hue = 0; hue < Hues.size(); ++hue)
{
//Add the X and Y values to the sum X and Y
X += cos(Hues[hue] / 180 * PI);
Y += sin(Hues[hue] / 180 * PI);
}

//Now average the X and Y values
X /= Hues.size();
Y /= Hues.size();

//Get atan2 of those
double AverageColor = atan2(X, Y) * 180 / PI;

std::cout << "Average: " << AverageColor << "\n";
return 0;
}

Вместо ожидаемого ответа 3 (так как 355 должен быть эквивалентен -5 в этой схеме), я получаю 86.9951.

Может кто-нибудь указать, что я делаю не так? Это кажется очень простым.

6

Решение

atan2 принимает свои аргументы в обратном порядке. Я знаю, раздражает! Так что постарайтесь:

double AverageColor = atan2(Y, X) * 180 / PI;

Ответ, который он дает сейчас, 3.00488.

7

Другие решения

Пытаться atan2(Y, X), atan2(a,b) похож на atan(a/b)и вам нужен арктангенс среднего синуса над средним косинусом.

2

По вопросам рекламы [email protected]