Farbverläufe

Previous topic - Next topic

Quentin

Grundlage ist ein PureBasic-Listing von http://www.purearea.net/pb/CodeArchiv/Graphics/Image/GradientImage.pb

Code (glbasic) Select
// --------------------------------- //
// Project: Farbverlauf
// Start: Monday, December 31, 2007
// IDE Version: 5.110



color1 = RGB(255, 0, 10)
color2 = RGB(60, 255, 255)

WHILE TRUE
  Farbverlauf(100, 0, 500, 200, color1, color2, 0)
  Farbverlauf(100, 220, 500, 450, color2, color1, 1)
  SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// ---  FARBVERLAUF  ---
// x1, y1, x2, y2    --- Koordinaten des Rechteckes für den
//                       Farbverlauf
// co1, col2         --- Farben für den Farbverlauf (von .. bis)
// direction         --- 0 = horizontaler Verlauf
//                       <> 0 = vertikaler Verlauf
// ------------------------------------------------------------- //
FUNCTION Farbverlauf: x1, y1, x2, y2, col1, col2, direction

  LOCAL i
  LOCAL cr1, cg1, cb1
  LOCAL cr2, cg2, cb2
  LOCAL dr, dg, db
  LOCAL red, green, blue
  LOCAL count

  SplitColor(col1, cr1, cg1, cb1)
  SplitColor(col2, cr2, cg2, cb2)

  IF direction = 0
    count = x2 - x1 + 1
  ELSE
    count = y2 - y1 + 1
  ENDIF
 
  dr = (cr1 - cr2) / count
  dg = (cg1 - cg2) / count
  db = (cb1 - cb2) / count

  FOR i = 0 TO count
    red = cr1 - i * dr
    green = cg1 - i * dg
    blue = cb1 - i * db
    IF direction = 0
      DRAWLINE x1 + i, y1, x1 + i, y2, RGB(red, green, blue)
    ELSE
      DRAWLINE x1, y1 + i, x2, y1 + i, RGB(red, green, blue)
    ENDIF
  NEXT

ENDFUNCTION // FARBVERLAUF


// ------------------------------------------------------------- //
// ---  SPLITCOLOR  ---
// ------------------------------------------------------------- //
FUNCTION SplitColor: color, BYREF red, BYREF green, BYREF blue

  red = bAND(color, 255)
  green = bAND(color / 256, 255)
  blue = bAND(color / POW(256, 2), 255)

ENDFUNCTION // SPLITCOLOR

Schranz0r

Was haste den vor?


EDIT:

ohhh jetzt seh ich es ein Farbverlauf :D

werd ich mal antesten!


EDIT2:

Coole sache!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

jau, naja vielleicht auch nicht wirklich sinnvoll, aber so sinnarme Spielereien machen mir zur Zeit Spaß ;)

mit Verwendung von ALPHAMODE kann man so auch die Farbverläufe auf angezeigte Grafiken übertragen

Code (glbasic) Select
// --------------------------------- //
// Project: Farbverlauf
// Start: Monday, December 31, 2007
// IDE Version: 5.110


FOR i = 0 TO 19
  DRAWRECT i * 5, i * 5, 200 - i * 10, 200 - i * 10, RGB(RND(255), RND(255), RND(255))
NEXT
GRABSPRITE 0, 0, 0, 200, 200
color1 = RGB(255, 0, 10)
color2 = RGB(60, 255, 255)
alpha = 0
addi = 0.01
alpha = 0

WHILE TRUE
  INC alpha, addi
  IF alpha > 1 OR alpha < 0 THEN addi = -addi
  DRAWSPRITE 0, 300, 0
  Farbverlauf(100, 0, 500, 200, color1, color2, 0, alpha)
  Farbverlauf(100, 220, 500, 450, color2, color1, 1, alpha)
  SHOWSCREEN
WEND

// ------------------------------------------------------------- //
// ---  FARBVERLAUF  ---
// x1, y1, x2, y2    --- Koordinaten des Rechteckes für den
//                       Farbverlauf
// co1, col2         --- Farben für den Farbverlauf (von .. bis)
// direction         --- 0 = horizontaler Verlauf
//                       <> 0 = vertikaler Verlauf
// alpha             --- Alphamode für Einfärbeffekte
// ------------------------------------------------------------- //
FUNCTION Farbverlauf: x1, y1, x2, y2, col1, col2, direction, alpha

  LOCAL width, i
  LOCAL cr1, cg1, cb1
  LOCAL cr2, cg2, cb2
  LOCAL dr, dg, db
  LOCAL red, green, blue
  LOCAL count

  SplitColor(col1, cr1, cg1, cb1)
  SplitColor(col2, cr2, cg2, cb2)

  IF direction = 0
    count = x2 - x1 + 1
  ELSE
    count = y2 - y1 + 1
  ENDIF

  dr = (cr1 - cr2) / count
  dg = (cg1 - cg2) / count
  db = (cb1 - cb2) / count

  FOR i = 0 TO count
    red = cr1 - i * dr
    green = cg1 - i * dg
    blue = cb1 - i * db
    IF direction = 0
      ALPHAMODE alpha
      DRAWLINE x1 + i, y1, x1 + i, y2, RGB(red, green, blue)
    ELSE
      ALPHAMODE alpha
      DRAWLINE x1, y1 + i, x2, y1 + i, RGB(red, green, blue)
    ENDIF
  NEXT

ENDFUNCTION // FARBVERLAUF


// ------------------------------------------------------------- //
// ---  SPLITCOLOR  ---
// ------------------------------------------------------------- //
FUNCTION SplitColor: color, BYREF red, BYREF green, BYREF blue

  red = bAND(color, 255)
  green = bAND(color / 256, 255)
  blue = bAND(color / POW(256, 2), 255)

ENDFUNCTION // SPLITCOLOR

Kitty Hello

Unter Win32 macht man Farbverläufe besser mit POLYVECTOR.

Schranz0r

ist die einfachste Lösung ja, aber nicht so schön verspielt ^^
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

stimmt, das mit POLYVECTOR ist mir nachher auch noch eingefallen, habs nur noch nicht hinbekommen ;)

S.O.P.M.

Au ja, das ist traumhaft mit den Farbverläufen bei POLYVECTOR. Vor allem, weil sich wirklich jede Ecke anders einfärben lässt und dann alles perfekt ineinander fließt. Das muss intern ein toller Algorithmus sein!
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium