I find a new solution
I think this solution is best
'colored circle generator #1
Private Sub Pattern (Diameter As Int)As Bitmap
Dim Btm As Bitmap
Dim Can As Canvas
Dim Width As Int = Diameter '200dip
Dim Height As Int = Diameter '200dip
'Center Point
Dim CenterX As Int = Width/2
Dim CenterY As Int = Height/2
Dim radius As Int = CenterX * CenterY
' RED
Dim redX As Int = Width
Dim redY As Int = Height /2
Dim redRad As Int = Width*Width
' Green
Dim greenX As Int = 0
Dim greenY As Int = Height/2
Dim greenRad As Int = Width*Width
'Blue
Dim blueX As Int = Width/ 2
Dim blueY As Int = Height
Dim blueRad As Int = Width*Width
Btm.InitializeMutable(Width,Height)
Can.Initialize2(Btm)
For i=0 To Width-1
For j=0 To Height-1
Dim a As Int = i - CenterX
Dim b As Int = j - CenterY
Dim distance As Int = a * a + b * b
If (distance < radius) Then
Dim rdx As Int = i - redX
Dim rdy As Int = j - redY
Dim redDist As Int = (rdx * rdx + rdy * rdy)
Dim redVal As Int = (255 - ((redDist / redRad) * 256))
Dim gdx As Int = i - greenX
Dim gdy As Int = j - greenY
Dim greenDist As Int = (gdx * gdx + gdy * gdy)
Dim greenVal As Int = (255 - ((greenDist / greenRad) * 256))
Dim bdx As Int = i - blueX
Dim bdy As Int = j - blueY
Dim blueDist As Int = (bdx * bdx + bdy * bdy)
Dim blueVal As Int = (255 - ((blueDist / blueRad) * 256))
Dim HSV() As Int=RGBtoHSV(redVal,greenVal,blueVal)
Dim V As Double=HSV(2)/255
Dim c As Int = Colors.rgb(redVal/v, greenVal/v, blueVal/v)
Can.DrawPoint(i,j,c)
Else
Can.DrawPoint(i,j,Colors.RGB(255,255,255)) 'color of points outside the circle
End If
Next
Next
Return Can.Bitmap
End Sub
'RGB to HSV colorspace, probably not accurate
Private Sub RGBtoHSV(red As Int, Green As Int, Blue As Int) As Int()
Dim h,s,v As Int
Dim mMin,mMax As Int
mMin=Min(Min(red,Green),Blue)
mMax=Max(Max(red,Green),Blue)
v=mMax
If v=0 Then
s=0:h=0
Return Array As Int(h,s,v)
End If
s = 255 * (mMax - mMin) / v
If s=0 Then
h=0
Return Array As Int(h,s,v)
End If
If mMax =red Then
h = 0 + 43 * (Green - Blue) / (mMax - mMin)
else if mMax = Green Then
h = 85 + 43 * (Blue - red) / (mMax - mMin)
Else
h = 171 + 43 * (red - Green) / (mMax - mMin)
End If
Return Array As Int(h,s,v)
End Sub
You should read that thread.Sorry..but.... What's aliasing?
Sub ColorWheel As Bitmap
Dim Can As Canvas
Dim Bt As Bitmap
Dim D As Int = 240
Dim Center As Int = D/4
Dim Radius As Int = D/4
Dim X,Y As Int
Bt.InitializeMutable(d/2,d/2)
Can.Initialize2(Bt)
SetAntiAlias(Can)
For h=0 To d
For s=0 To d-10
X=Center+(s*Radius/D)*Cos(2*cPI*H/d)
Y=Center+(s*Radius/D)*Sin(2*cPI*H/D)
Can.DrawPoint(x,y ,HSLtoRGB(H,s,100,255))
' X2=Center+(s*Radius/D*Cos(2*cPI*(H-1)/d))
' Y2=Center+(s*Radius/D)*Sin(2*cPI*(H-1)/D)
' Can.DrawLine(X,Y,X2,Y2,HSLtoRGB(H,s+10,100,255),3)
Next
Next
Return Can.Bitmap
End Sub
Sub HSLtoRGB(Hue As Int, Saturation As Int, Luminance As Int, Alpha As Int ) As Int
Dim temp3(3) As Double , Red As Int, Green As Int, Blue As Int ,temp1 As Double, temp2 As Double ,n As Int
Dim pHue As Double, pSat As Double, pLum As Double , pRed As Double, pGreen As Double, pBlue As Double
pHue = Min(239, Hue) / 239
pSat = Min(239, Saturation) / 239
pLum = Min(239, Luminance) / 239
If pSat = 0 Then
pRed = pLum
pGreen = pLum
pBlue = pLum
Else
If pLum < 0.5 Then
temp2 = pLum * (1 + pSat)
Else
temp2 = pLum + pSat - pLum * pSat
End If
temp1 = 2 * pLum - temp2
temp3(0) = pHue + 1 / 3
temp3(1) = pHue
temp3(2) = pHue - 1 / 3
For n = 0 To 2
If temp3(n) < 0 Then temp3(n) = temp3(n) + 1
If temp3(n) > 1 Then temp3(n) = temp3(n) - 1
If 6 * temp3(n) < 1 Then
temp3(n) = temp1 + (temp2 - temp1) * 6 * temp3(n)
Else
If 2 * temp3(n) < 1 Then
temp3(n) = temp2
Else
If 3 * temp3(n) < 2 Then
temp3(n) = temp1 + (temp2 - temp1) * ((2 / 3) - temp3(n)) * 6
Else
temp3(n) = temp1
End If
End If
End If
Next
pRed = temp3(0)
pGreen = temp3(1)
pBlue = temp3(2)
End If
Red = pRed * 255
Green = pGreen * 255
Blue = pBlue * 255
Return Colors.ARGB(Alpha, Red,Green,Blue)
End Sub
Sub SetAntiAlias (c As Canvas)
Dim r As Reflector
Dim NativeCanvas As Object
r.Target = c
NativeCanvas = r.GetField("canvas")
Dim PaintFlagsDrawFilter As Object
PaintFlagsDrawFilter = r.CreateObject2("android.graphics.PaintFlagsDrawFilter", _
Array As Object(0, 1), Array As String("java.lang.int", "java.lang.int"))
r.Target = NativeCanvas
r.RunMethod4("setDrawFilter", Array As Object(PaintFlagsDrawFilter), Array As String("android.graphics.DrawFilter"))
End Sub
I know but if you need to pick up a single pixel it might be a pixel added by the antialiasing.instead work it good.
Do not forget that there are luckyI find this (is very nice)
https://github.com/QuadFlask/colorpicker
You're right, I just saw that it's aesthetically pleasing.Do not forget that there are luckypeople like me: colorblind.
For "us" it is necessary to have the 3 cursors for red, green, blue (and alpha?).