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.

War es hilfreich?

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).

Mac OS X Farbauswahl

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:

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 tun
double 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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top