Vì vậy, tôi đã cố gắng giải thích cách tính màu trung bình của một số đối tượng có màu được biểu thị bằng giá trị HSL. Rất may, tôi tình cờ gặp this Stack Overflow post và thiết lập để hoạt động triển khai thuật toán được cung cấp trong câu trả lời hàng đầu (Tôi đang làm việc trong C++).Giá trị trung bình tròn (đặc biệt là Hues trong bảng màu HSL)
Rất tiếc, triển khai của tôi dường như không hoạt động. Ở đây nó là, đầy đủ; lưu ý rằng mặc dù tôi viết "Huế" Tôi đang sử dụng góc độ, theo độ, theo thực hiện ban đầu (chuyển đổi từ 0-360 góc thành 0-256 màu, một khi tôi biết mã của tôi hoạt động, không nên khó).
#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;
}
Thay vì câu trả lời mong đợi của 3 (từ 355 phải tương đương với -5 trong lược đồ này), tôi nhận được 86,9951.
Ai đó có thể chỉ ra những gì tôi đang làm sai? Điều này có vẻ rất cơ bản.
Ôi trời, điều đó thật đáng xấu hổ. Tôi nên thấy điều đó. Cảm ơn! – GarrickW
Một cách để nhắc nhở chính mình về thực tế này là hãy nhớ rằng những gì bạn đang cố gắng làm là lấy 'atan (Y/X)', ngoại trừ việc chúng ta muốn nó vẫn hoạt động như 'X -> 0'. Kiểu này trông giống như 'atan2 (Y, X)'. –
Để đơn giản hóa cuộc sống của lập trình viên, lưu ý rằng một số ngôn ngữ theo thứ tự ngược lại - ví dụ trong Excel atan2 (x; y) –