Was ist die Mathematik hinter dem Farbrad
-
26-09-2019 - |
Frage
Ich möchte mit 12 Scheiben eine Torte erstellen, wobei jede Scheibe eine andere Farbe.
So ziemlich jeder Farbrad scheint das gleiche Format zu folgen; zB: http://www.tigercolor.com/ Farbe-lab / Farbenlehre / color-Theorie-intro.htm .
Aber was Algorithmen sind für die Farben zu erzeugen? Was ist die Mathematik hinter RGB (theta)? Sicherlich muss es einige etablierte Wissenschaft auf das sein, aber Google gibt mir keine Hinweise.
Lösung
Hier finden Sie aktuelle http://www.easyrgb.com es die Algorithmen hinter vielen Farbkonvertierungen hat. Hier ist die RGB -.> HSV ein
var_R = ( R / 255 ) //RGB from 0 to 255
var_G = ( G / 255 )
var_B = ( B / 255 )
var_Min = min( var_R, var_G, var_B ) //Min. value of RGB
var_Max = max( var_R, var_G, var_B ) //Max. value of RGB
del_Max = var_Max - var_Min //Delta RGB value
V = var_Max
if ( del_Max == 0 ) //This is a gray, no chroma...
{
H = 0 //HSV results from 0 to 1
S = 0
}
else //Chromatic data...
{
S = del_Max / var_Max
del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max
if ( var_R == var_Max ) H = del_B - del_G
else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R
if ( H < 0 ) H += 1
if ( H > 1 ) H -= 1
}
Andere Tipps
ein Farbrad (wie die Mac OS X-Farbauswahl, Bild unten) zeigt Farbton und Sättigung (zwei der drei Komponenten aus dem HSV-Farbraum ). Der Farbton ändert sich mit dem Winkel, und die Sättigung variiert mit dem Radius. Typischerweise gibt es einen separaten Schieberegler für den Wert (aka Helligkeit).
Siehe Wikipedia wie hin und her zwischen HSV und RGB zu konvertieren. Oder es kann eine API für die Programmiersprache der Wahl sein. Zum Beispiel hat Python die colorsys
Bibliothek .
Ich habe das Spiel mit Herstellung einer HSL-basierten Farbrad in Excel VBA, mit winzigen Zellen als „Pixel“, und es stellte sich ziemlich gut, so dass ich dachte, ich würde Aktie.
Dies zeigt die Konvertierung zwischen HSL und RGB und wie programmatisch Zeichnen von Linien / Kreise auf einem beliebigen Raster -. Auch Tabellenzellen
Der Code ist bereit zu laufen, wie sie ist:
Option Explicit
Const colorSheetName = "COLORS"
Const pi = 3.14159265358979
Const squareSize = 3.75 'cell square size (pts)
Const cDiameter = 80# 'circle diameter (cells)
Const numAngles = 360# 'number of angles (lines to draw)
Sub CalculateColorWheel()
Dim ws As Worksheet, radsPerAngle As Double, radius As Long, xStop As Double, _
yStop As Double, z As Integer, xyLength As Double, lineDot As Long, _
lineLength As Long, h As Byte, s As Byte, v As Byte, r As Byte, g As Byte, b As Byte
Set ws = ThisWorkbook.Sheets.Add 'create new worksheet
On Error Resume Next 'ignore error
Application.DisplayAlerts = False 'ignore warning
ThisWorkbook.Sheets(colorSheetName).Delete 'delete worksheet (if exists)
Application.DisplayAlerts = True 'stop ignoring warnings
On Error GoTo 0 'stop ignoring errors
With ws
.Name = colorSheetName 'name the new sheet
.Rows.RowHeight = squareSize 'set rowheight
.Columns.ColumnWidth=widthToColumnWidth(squareSize) 'match columnwidth to row
ActiveWindow.DisplayGridlines = False 'hide gridlines
ActiveWindow.DisplayHeadings = False 'hide row/col headings
radius = cDiameter / 2 'centre point
lineLength = radius * 1.5 'dots per angle (line)
radsPerAngle = (360 / numAngles) * pi / 180 'radians=a(degrees)×pi÷180°
Debug.Print "Grid size=" & .[a1].Height & "×" & .[a1].Width _
& ", Diameter:" & cDiameter _
& ", Area=" & Round(pi * radius ^ 2, 0) _
& ", Circumference=" & Round(2 * pi * radius, 0) _
& ", Radians per Angle=" & Round(radsPerAngle, 3) _
& " × " & numAngles & " angles" 'stats
For z = 0 To numAngles - 1 'loop through each angle
For lineDot = 1 To lineLength 'loop thru length of line
xyLength = radius * (lineDot / lineLength) 'calc dot xy& offset top-left
xStop = Int(Cos(radsPerAngle * z) * xyLength) + radius + 2 'x (column)
yStop = Int(Sin(radsPerAngle * z) * xyLength) + radius + 2 'y (row)
If .Cells(yStop, xStop).Interior.Pattern=xlNone Then 'skip colored cells
h = ((z + 1) / numAngles) * 255 'hue=angle
s = (lineDot / lineLength) * 255 'saturation=radius
v = 255 'maximum brightness. (Adjustable)
HSVtoRGB h, s, v, r, g, b 'convert HSV to RGB
.Cells(yStop, xStop).Interior.Color=rgb(r,g,b) 'color the cell
dots = dots + 1
End If
Next lineDot
Application.StatusBar = Format(z / (numAngles - 1), "0%")
DoEvents 'don't lag
Next z
End With
Beep
Application.StatusBar = "Finished drawing color circle (" & dots & " colors)"
End Sub
Public Function widthToColumnWidth(pts As Double) As Double
'convert desired column width (points) to Excel "ColWidthUnits"
'12pts and under is a 1:12 ratio of (colWidthUnits:Pts).
' Over 12pts: 1:12 for 1st unit, then 1:(75/11) for remainder
Select Case pts
Case Is <= 0: widthToColumnWidth = 0
Case Is <= 12: widthToColumnWidth = pts / 12
Case Else: widthToColumnWidth = 1 + (pts - 12) / (75 / 11) '
End Select
End Function
Public Sub HSVtoRGB(h As Byte, s As Byte, v As Byte, r As Byte, g As Byte, b As Byte)
Dim minV As Byte, maxV As Byte, Chroma As Byte, tempH As Double
If v = 0 Then
r = 0: g = 0: b = 0
Else
If s = 0 Then
r = v: g = v: b = v:
Else
maxV = v: Chroma = s / 255 * maxV: minV = maxV - Chroma
Select Case h
Case Is >= 170: tempH = (h - 170) / 43: g = 0
If tempH < 1 Then
b = maxV: r = maxV * tempH
Else: r = maxV: b = maxV * (2 - tempH): End If
Case Is >= 85: tempH = (h - 85) / 43: r = 0
If tempH < 1 Then
g = maxV: b = maxV * tempH
Else: b = maxV: g = maxV * (2 - tempH): End If
Case Else: tempH = h / 43: b = 0
If tempH < 1 Then
r = maxV: g = maxV * tempH
Else: g = maxV: r = maxV * (2 - tempH): End If
End Select
r = r / maxV * (maxV - minV) + minV
g = g / maxV * (maxV - minV) + minV
b = b / maxV * (maxV - minV) + minV
End If
End If
End Sub
Wie dies in Excel ausgeführt wird: Fügen Sie den Code oben und fügen Sie ihn in ein reguläres Modul . (Code auswählen, Strg + C kopieren, dann in Excel, halten Alt und Hit F11 + I + M und dann Strg + V einzufügen, und F5 ausgeführt werden.) ??
Weitere Informationen:
- Wikipedia: HSL und HSV
- Wikipedia: Color Wheel - HSL
- colormatters.com: Grundfarbtheorie
- Wikipedia: Rasterung von Kreisen
Wenn Sie ein Farbrad wie das Beispiel mögen Sie zur Verfügung gestellt (und wie die meisten Farbrad werden Sie in einem Bastelgeschäft Farbe Abschnitt finden), wo rot gegenüber grün und blau ist gegenüber gelb-orange, lila gegenüber gelb, usw. ., können Sie die folgende Mathematik ändern Farbton von HSL oder HSV zu bekommen, das Vermächtnis Farbton ...
einfach tundouble ToLegacyHue(double modernHue) {
modernHue = ((modernHue % 360) + 360) % 360; // normalize 360 > modernHue >= 0
double ret = 0;
if(modernHue < 60) {
ret = modernHue * 2;
} else if(modernHue < 120) {
ret = modernHue + 60;
} else {
ret = (modernHue - 120) * 0.75 + 180;
}
return ret;
}
double FromLegacyHue(double legacyHue) {
legacyHue = ((legacyHue % 360) + 360) % 360; // normalize 360 > legacyHue >= 0
double ret = 0;
if(legacyHue < 120) {
ret = legacyHue / 2;
} else if(legacyHue < 180) {
ret = legacyHue - 60;
} else {
ret = (legacyHue - 180) / 0.75 + 120;
}
return ret;
}