color/RGB.js

import { Couleur } from './Couleur.js';
import { XYZ } from './XYZ.js';

/**
 * @author Mattis Pingard mattis.pingard@gmail.com
 * @date 15/01/2024
 * Classe représentant une Couleur sous forme RGB
 */
export class RGB extends Couleur {

    // ATTRIBUTS
    /**
     * Transparence de la couleur
     */
    #_transparence;

    // CONSTRUCTEUR
    /**
     * Créer une Couleur sous la forme RGB
     * @param {float} comp1 La valeur de la composante 1
     * @param {float} comp2 La valeur de la composante 2
     * @param {float} comp3 La valeur de la composante 3
     * @param {float} alpha La valeur de la transparence
     */
    constructor(comp1 = 0, comp2 = 0, comp3 = 0, alpha = 0) {
        super(comp1, comp2, comp3);
        this.#_transparence = alpha;
    }

    // GETTERS & SETTERS
    /**
     * Obtient la valeur de la transparence
     * @returns {float} La valeur de la transparence
     */
    getAlpha() {
        return(this.#_transparence);
    }

    /**
     * Définit la valeur de la transparence
     * @param {int} a La nouvelle valeur de la transparence
     */
    setAlpha(a) {
        this.#_transparence = a;
    }

    // METHODES
    /**
     * Transformer une Couleur RGB vers XYZ
     * @returns {XYZ} La Couleur sous forme XYZ
     */
    RGBversXYZ() {
        // Matrice de transformation.
        const M = [
            [0.4124564, 0.3575761, 0.1804375],
            [0.2126729, 0.7151522, 0.0721750],
            [0.0193339, 0.1191920, 0.9503041]
        ];

        let rgb = new RGB(this.getComp(1), this.getComp(2), this.getComp(3)); // Copie de la couleur pour ne pas modifier l'originale

        // Normalisation et linearisation du RGB (obligatoire pour convertir en XYZ)
        for (let i = 1; i < 4; i++) {
            rgb.setComp(i, rgb.getComp(i) / 255);
            if (rgb.getComp(i) <= 0.04045) {
                rgb.setComp(i, rgb.getComp(i) / 12.92);
            } else {
                rgb.setComp(i, Math.pow((rgb.getComp(i) + 0.055) / 1.055, 2.4));
            }
        }

        let xyz = new XYZ();

        // Conversion en XYZ
        for (let i = 1; i < 4; i++) {
            for (let j = 1; j < 4; j++) {
                xyz.setComp(i, (xyz.getComp(i) + rgb.getComp(j) * M[i-1][j-1]));
            }
        }

        return xyz;
    }
}