2012-12-19 66 views
6

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.

Trả lời

7

atan2 lấy các đối số của nó theo thứ tự ngược lại. Tôi biết, gây phiền nhiễu! Vì vậy, hãy thử:

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

Câu trả lời hiện tại là 3.00488.

+0

Ôi trời, điều đó thật đáng xấu hổ. Tôi nên thấy điều đó. Cảm ơn! – GarrickW

+4

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)'. –

+0

Để đơ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) –

2

Hãy thử atan2(Y, X). atan2(a,b) tương tự như atan(a/b) và bạn cần arctangent của sin trung bình trên cosin trung bình.

Các vấn đề liên quan