根據(jù)給定顏色定位到彩色圓上的位置

項(xiàng)目中有這樣的需求,獲取到的某一種顏色,將button 定位到彩色圓上的位置。
這里需要用到HSB的概念了。

色相H( Hue ):在0~360°的標(biāo)準(zhǔn)色環(huán)上,按照角度值標(biāo)識(shí)。比如紅是0°、橙色是30°等。
飽和度S( saturation ):是指顏色的強(qiáng)度或純度。飽和度表示色相中彩色成分所占的比例,用從0%(灰色)~100%(完全飽和)的百分比來(lái)度量。在色立面上飽和度是從內(nèi)向外逐漸增加。
亮度B( brightness ):是顏色的明暗程度,通常是從0(黑)~100%(白)的百分比來(lái)度量的,在色立面中從上至下逐漸遞減,上邊線為100%,下邊線為0% 。

既然是0~360°,紅色的是0°. 根據(jù)角度來(lái)定位。
當(dāng)然這是一種思路而已,大屌繞道。
舉個(gè)我這邊的例子:我這邊是根據(jù)一張彩色的圖片來(lái)的

    UIImageView *imgView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Combined Shape"]];
    imgView.frame=CGRectMake(70, 74, 235, 235);
    imgView.userInteractionEnabled=YES;
    [self.view addSubview:imgView];
    self.imgView=imgView;
    
    UIButton *btn=[UIButton buttonWithType:UIButtonTypeCustom];
    btn.layer.cornerRadius=11.5;
    btn.backgroundColor=[UIColor clearColor];
    btn.layer.borderColor=[UIColor whiteColor].CGColor;
    btn.layer.borderWidth=2;
    btn.size=CGSizeMake(23, 23);
    btn.center=CGPointMake(imgView.frame.size.width/2, imgView.frame.size.height/2-107);
    [imgView addSubview:btn];
    self.sliderBtn=btn;
    
    [[[UIColor redColor] neoToHSL] getHue:&_hue saturation:&_saturation brightness:&_luminosity alpha:&_alpha];
    [self positionHue];
- (void) positionHue {
    CGFloat angle = M_PI * 2 * _hue+M_PI*1/3;
    CGFloat cx = 107 * cos(angle) + self.imgView.frame.size.width/2 ;
    CGFloat cy = 107 * sin(angle) + self.imgView.frame.size.width/2 ;
    CGRect frame = self.sliderBtn.frame;
    frame.origin.x = cx;
    frame.origin.y = cy;
    self.sliderBtn.center = CGPointMake(cx, cy);
}

如上代碼得到的效果就是這樣:

1.png

可以看出定位在紅色位置了, 我這邊因?yàn)槭羌t色并不在0度的位置,所以+M_PI*1/3的角度,這個(gè)自行調(diào)整。

顏色是先轉(zhuǎn)成HSL的Color了再獲取到飽和度。
位置就根據(jù)角度來(lái)算了,考驗(yàn)數(shù)學(xué)能力了。
其他就根據(jù)自身需求做一些調(diào)整,修改咯。

最后擺一個(gè)轉(zhuǎn)HSL的分類:

- (UIColor *) neoToHSL {
    CGFloat h, s, l, w, a;
    if ([self getHue:&h saturation:&s brightness:&l alpha:&a]) {
        return self;
    } else if ([self getWhite:&w alpha:&a]) {
        return [UIColor colorWithHue:0 saturation:0 brightness:w alpha:a];
    } else {
        CGFloat r, g, b;
        [self getRed:&r green:&g blue:&b alpha:&a];
        CGFloat min, max, delta;
        min = MIN(MIN(r, g), b);
        max = MAX(MAX(r, g), b);
        delta = max - min;
        l = (max + min) / 2;
        if (delta == 0) {
            h = 0;
            s = 0;
        } else {
            if (l < 0.5 ) {
                s = max / ( max + min );
            } else {
                s = max / ( 2 - max - min );
            }
            
            CGFloat dR, dG, dB;
            
            dR = (((max - r) / 6.0) + (max / 2)) / max;
            dG = (((max - g) / 6) + (max / 2)) / max;
            dB = (((max - b) / 6) + (max / 2)) / max;

            if (r == max) {
                h = dB - dG;
            } else if (g == max) {
                h = 1/3 + dR - dB;
            } else if (b == max) {
                h = 2/3 + dG - dR;
            }
            
            if (h < 0) h += 1;
            if (h > 1) h -= 1;
        }
        return [UIColor colorWithHue:h saturation:s brightness:l alpha:a];
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容