extras:codikon:p5js:subtraktive-farbmischung
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| extras:codikon:p5js:subtraktive-farbmischung [2025/07/06 07:34] – removed - external edit (Unknown date) 127.0.0.1 | extras:codikon:p5js:subtraktive-farbmischung [2025/07/06 07:34] (current) – ↷ Page moved from codikon:p5js:subtraktive-farbmischung to extras:codikon:p5js:subtraktive-farbmischung Felix Hardmood Beck | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ===== Subtraktive Farbmischung – CMY (0–100 %) ===== | ||
| + | < | ||
| + | < | ||
| + | <script src=" | ||
| + | < | ||
| + | # | ||
| + | position: relative; | ||
| + | width: 600px; | ||
| + | height: 550px; | ||
| + | margin-left: | ||
| + | } | ||
| + | |||
| + | canvas { | ||
| + | position: absolute; | ||
| + | left: 0; | ||
| + | top: 0; | ||
| + | z-index: 0; | ||
| + | } | ||
| + | |||
| + | .custom-slider { | ||
| + | position: absolute; | ||
| + | -webkit-appearance: | ||
| + | height: 10px; | ||
| + | background: #888; | ||
| + | border-radius: | ||
| + | outline: none; | ||
| + | z-index: 1; | ||
| + | } | ||
| + | |||
| + | .custom-slider:: | ||
| + | -webkit-appearance: | ||
| + | width: 16px; | ||
| + | height: 16px; | ||
| + | background: #fff; | ||
| + | border-radius: | ||
| + | cursor: pointer; | ||
| + | border: 2px solid #000; | ||
| + | } | ||
| + | |||
| + | .custom-slider:: | ||
| + | width: 16px; | ||
| + | height: 16px; | ||
| + | background: #fff; | ||
| + | border-radius: | ||
| + | cursor: pointer; | ||
| + | border: 2px solid #000; | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | < | ||
| + | <div id=" | ||
| + | |||
| + | < | ||
| + | let cSlider, mSlider, ySlider, distanceSlider; | ||
| + | |||
| + | function setup() { | ||
| + | let canvas = createCanvas(600, | ||
| + | canvas.parent(" | ||
| + | noStroke(); | ||
| + | |||
| + | distanceSlider = createSlider(0, | ||
| + | distanceSlider.parent(" | ||
| + | distanceSlider.class(" | ||
| + | distanceSlider.style(" | ||
| + | distanceSlider.position(25, | ||
| + | |||
| + | cSlider = createSlider(0, | ||
| + | cSlider.parent(" | ||
| + | cSlider.class(" | ||
| + | cSlider.style(" | ||
| + | cSlider.position(20, | ||
| + | |||
| + | mSlider = createSlider(0, | ||
| + | mSlider.parent(" | ||
| + | mSlider.class(" | ||
| + | mSlider.style(" | ||
| + | mSlider.position(220, | ||
| + | |||
| + | ySlider = createSlider(0, | ||
| + | ySlider.parent(" | ||
| + | ySlider.class(" | ||
| + | ySlider.style(" | ||
| + | ySlider.position(420, | ||
| + | } | ||
| + | |||
| + | function draw() { | ||
| + | background(255); | ||
| + | |||
| + | let cPercent = cSlider.value(); | ||
| + | let mPercent = mSlider.value(); | ||
| + | let yPercent = ySlider.value(); | ||
| + | |||
| + | let c = map(cPercent, | ||
| + | let m = map(mPercent, | ||
| + | let y = map(yPercent, | ||
| + | |||
| + | let sliderVal = distanceSlider.value(); | ||
| + | let maxDistance = 200; | ||
| + | let d = maxDistance - sliderVal; | ||
| + | |||
| + | let radius = 200; | ||
| + | let cx = width / 2; | ||
| + | let cy = height / 2 - 30; | ||
| + | |||
| + | let xC = cx; | ||
| + | let yC = cy - d; | ||
| + | |||
| + | let xM = cx - d * cos(PI / 6); | ||
| + | let yM = cy + d * sin(PI / 6); | ||
| + | |||
| + | let xY = cx + d * cos(PI / 6); | ||
| + | let yY = cy + d * sin(PI / 6); | ||
| + | |||
| + | blendMode(MULTIPLY); | ||
| + | |||
| + | fill(c, 255, 255); // Cyan | ||
| + | ellipse(xC, yC, radius); | ||
| + | |||
| + | fill(255, m, 255); // Magenta | ||
| + | ellipse(xM, yM, radius); | ||
| + | |||
| + | fill(255, 255, y); // Yellow | ||
| + | ellipse(xY, yY, radius); | ||
| + | |||
| + | blendMode(BLEND); | ||
| + | |||
| + | fill(0); | ||
| + | textSize(14); | ||
| + | text(" | ||
| + | text(" | ||
| + | text(" | ||
| + | text(" | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Erklärung der subtraktiven Farbmischung ===== | ||
| + | |||
| + | Die **subtraktive Farbmischung** beschreibt die Farberzeugung durch das **Entziehen (Subtrahieren) von Licht**. Sie ist das zentrale Prinzip bei der Arbeit mit **Pigmenten, | ||
| + | |||
| + | Im Gegensatz zur additiven Mischung, bei der Lichtquellen addiert werden, basiert die subtraktive Mischung auf reflektiertem Licht: Ein Körper erscheint farbig, weil bestimmte Wellenlängen vom Material **absorbiert** und andere **reflektiert** werden. | ||
| + | |||
| + | **Primärfarben** der subtraktiven Mischung (CMY-Modell): | ||
| + | * Cyan | ||
| + | * Magenta | ||
| + | * Yellow | ||
| + | |||
| + | **Sekundärfarben** (durch Überlagerung): | ||
| + | * Cyan + Magenta = Blau | ||
| + | * Cyan + Yellow = Grün | ||
| + | * Magenta + Yellow = Rot | ||
| + | * Cyan + Magenta + Yellow = Schwarz (idealerweise, | ||
| + | |||
| + | Bei realen Materialien ergibt die vollständige Überlagerung meist ein **dunkles Grau oder Braun**, da Pigmente keine idealen Filter sind. | ||
| + | |||
| + | Diese Mischung wird im modernen Farbdruck (z. B. Inkjet, Offset) durch das **CMYK-Modell** ergänzt, wobei „K“ für den Schwarzkanal steht. | ||
| + | |||
| + | ===== Beispiel p5.js Code (CMY in 0–100 %) ===== | ||
| + | |||
| + | < | ||
| + | let cSlider, mSlider, ySlider, distanceSlider; | ||
| + | |||
| + | function setup() { | ||
| + | createCanvas(600, | ||
| + | noStroke(); | ||
| + | |||
| + | distanceSlider = createSlider(0, | ||
| + | distanceSlider.position(25, | ||
| + | distanceSlider.style(" | ||
| + | |||
| + | cSlider = createSlider(0, | ||
| + | cSlider.position(20, | ||
| + | cSlider.style(" | ||
| + | |||
| + | mSlider = createSlider(0, | ||
| + | mSlider.position(220, | ||
| + | mSlider.style(" | ||
| + | |||
| + | ySlider = createSlider(0, | ||
| + | ySlider.position(420, | ||
| + | ySlider.style(" | ||
| + | } | ||
| + | |||
| + | function draw() { | ||
| + | background(255); | ||
| + | |||
| + | let cPercent = cSlider.value(); | ||
| + | let mPercent = mSlider.value(); | ||
| + | let yPercent = ySlider.value(); | ||
| + | |||
| + | let c = map(cPercent, | ||
| + | let m = map(mPercent, | ||
| + | let y = map(yPercent, | ||
| + | |||
| + | let d = 200 - distanceSlider.value(); | ||
| + | |||
| + | let radius = 200; | ||
| + | let cx = width / 2; | ||
| + | let cy = height / 2 - 30; | ||
| + | |||
| + | let xC = cx; | ||
| + | let yC = cy - d; | ||
| + | |||
| + | let xM = cx - d * cos(PI / 6); | ||
| + | let yM = cy + d * sin(PI / 6); | ||
| + | |||
| + | let xY = cx + d * cos(PI / 6); | ||
| + | let yY = cy + d * sin(PI / 6); | ||
| + | |||
| + | blendMode(MULTIPLY); | ||
| + | |||
| + | fill(c, 255, 255); | ||
| + | ellipse(xC, yC, radius); | ||
| + | |||
| + | fill(255, m, 255); | ||
| + | ellipse(xM, yM, radius); | ||
| + | |||
| + | fill(255, 255, y); | ||
| + | ellipse(xY, yY, radius); | ||
| + | |||
| + | blendMode(BLEND); | ||
| + | |||
| + | fill(0); | ||
| + | textSize(14); | ||
| + | text(" | ||
| + | text(" | ||
| + | text(" | ||
| + | text(" | ||
| + | } | ||
| + | </ | ||
