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(" | ||
+ | } | ||
+ | </ |