vector<ofColor> ofxColourTheory::createRangeFromCompound(ofColor src) {
    vector<ofColor> colList;
    colList.push_back(src);
    bool isFlipped = ofRandomf()>.5;
    
    int direction = isFlipped ? -1 : 1;
    
    ofColor c = rotateRYB(src,30 * direction);
    c.setBrightness(wrap(c.getBrightness()/255.0f, 0.25f, 0.6f, 0.25f)*255.0f);
    colList.push_back(c);
    
    c = rotateRYB(src,30 * direction);
    c.setSaturation(wrap(c.getSaturation()/255.0f, 0.4f, 0.1f, 0.4f)*255.0f);
    c.setBrightness(wrap(c.getBrightness()/255.0f, 0.4f, 0.2f, 0.4f)*255.0f);
    colList.push_back(c);
    
    c = rotateRYB(src,160 * direction);
    c.setSaturation(wrap(c.getSaturation()/255.0f, 0.25f, 0.1f, 0.25f)*255.0f);
    c.setBrightness(max(0.2f*255, c.getBrightness()*255));
    colList.push_back(c);
    
    c = rotateRYB(src,150 * direction);
    c.setSaturation(wrap(c.getSaturation()/255.0f, 0.1f, 0.8f, 0.1f)*255.0f);
    c.setBrightness(wrap(c.getBrightness()/255.0f, 0.3f, 0.6f, 0.3f)*255.0f);
     colList.push_back(c);
    
    c = rotateRYB(src,150 * direction);
    c.setSaturation(wrap(c.getSaturation()/255.0f, 0.1f, 0.8f, 0.1f)*255.0f);
    c.setBrightness(wrap(c.getBrightness()/255.0f, 0.4f, 0.2f, 0.4f)*255.0f);
     
     
    // colors.add(c);
    
    return colList;
}
vector<ofColor> ofxColourTheory::createRangeFromAnalogous(ofColor src){
    
    
    vector<ofVec2f> tones;
    tones.push_back(ofVec2f(1, 2.2f));
    tones.push_back(ofVec2f(2, 1));
    tones.push_back(ofVec2f(-1, -0.5f));
    tones.push_back(ofVec2f(-2, 1));
    
    float contrast = 0.25f;
    float theta = 10 *PI / 180.0;
        
    contrast = clipNormalized(contrast);
    
    vector<ofColor> colList;
    colList.push_back(src);
    
    
    for (int i=0;i<tones.size();i++) {
        ofColor c = rotateRYB(src,(int) (theta * tones[i].x));
        float t = 0.44f - tones[i].y * 0.1f;
        if ((float) src.getBrightness()/255.0 - contrast * tones[i].y < t) {
            c.setBrightness(t*255.0);
        } else {
            c.setBrightness(src.getBrightness() - (contrast * tones[i].y)*255.0);
        }
        c.setSaturation(c.getSaturation()-0.05f*255.0);
        colList.push_back(c);
    }
    return colList;
}
vector<ofColor> ofxColourTheory::createRangeFromSplitComplementary(ofColor src) {
    vector<ofColor> colList;
    colList.push_back(src);
    
    
    ofColor a = rotateRYB(src,150);
    a.setBrightness(a.getBrightness()+0.1f*255.0f);
    colList.push_back(a);
    
    ofColor b = rotateRYB(src,210);
    b.setBrightness(b.getBrightness()+0.1f*255.0f);
    colList.push_back(b);
    
    
    return colList;
}
vector<ofColor> ofxColourTheory::createRangeFromRightSplitComplementary(ofColor src) {
    ofColor right = getComplement(src);
    right = rotateRYB(right,30);
    right.setBrightness(right.getBrightness()+0.1f*255.0f);
    vector<ofColor> colList = createRangeFromComplementary(src);
    
    for (int i = 3; i < 6; i++) {
        ofColor c = colList[i];
        c.setHue(right.getHue());
    }
    return colList;
}
ofColor getComplement(ofColor col){
    return rotateRYB(col,180);
}