2012-12-19 22 views
6

तो मैं बाहर पहेली कैसे वस्तुओं जिसका रंग एचएसएल मूल्यों का प्रतिनिधित्व कर रहे के एक नंबर की औसत रंग की गणना करने की कोशिश कर रहा था। शुक्र है, मैंने this Stack Overflow post भर में ठोकर खाई, और शीर्ष उत्तर में प्रदान किए गए एल्गोरिदम को कार्यान्वित करने के लिए सेट करने के लिए सेट किया (मैं सी ++ में काम कर रहा हूं)।के औसत परिपत्र मूल्यों (विशेष रूप से एचएसएल रंग योजना में ह्यूज़)

दुर्भाग्य से, मेरा कार्यान्वयन काम नहीं कर रहा है। यहां यह पूरी तरह से है; ध्यान दें कि हालांकि मैं "ह्यू" लिखता हूं, प्रारंभिक कार्यान्वयन के अनुसार, डिग्री में, कोणों का उपयोग कर रहा हूं (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 मिलता है।

क्या कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं? यह बहुत बुनियादी लगता है।

उत्तर

7

atan2 उलटे क्रम में अपने तर्क लेता है। मुझे पता है, कष्टप्रद! तो कोशिश करें:

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

उत्तर अब यह 3.00488 है।

+0

ओह देवता, यह शर्मनाक है। मुझे यह देखना चाहिए था। धन्यवाद! – GarrickW

+4

इस तथ्य के बारे में खुद को याद दिलाने का एक तरीका यह याद रखना है कि आप जो करने की कोशिश कर रहे हैं वह 'एतान (वाई/एक्स)' प्राप्त करना है, सिवाय इसके कि हम चाहते हैं कि यह अभी भी 'एक्स -> 0' के रूप में काम करे। इस तरह के दिखने जैसे 'atan2 (वाई, एक्स)'। –

+0

प्रोग्रामर के जीवन को सरल बनाने के लिए, ध्यान दें कि कुछ भाषाएं विपरीत क्रम में हैं - उदाहरण के लिए Excel atan2 (x; y) –

2

atan2(Y, X) की कोशिश करो। atan2(a,b)atan(a/b) के समान है, और आपको औसत कोसाइन पर औसत साइन के आर्कटैंजेंट की आवश्यकता होती है।