Files
Terrarum/src/net/torvald/colourutil/HSVUtil.kt
2017-09-20 14:36:40 +09:00

116 lines
2.5 KiB
Kotlin

package net.torvald.colourutil
import com.jme3.math.FastMath
import com.badlogic.gdx.graphics.Color
/**
* OBSOLETE; use CIELchUtil for natural-looking colour
*
* Created by minjaesong on 2016-01-16.
*/
object HSVUtil {
/**
* Convert HSV parameters to RGB color.
* @param H 0-359 Hue
* *
* @param S 0-1 Saturation
* *
* @param V 0-1 Value
* @link http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
*/
fun toRGB(H: Float, S: Float, V: Float, alpha: Float = 1f): Color {
var H = H
H %= 360f
val C = V * S
val X = C * (1 - FastMath.abs(
H / 60f % 2 - 1))
val m = V - C
var R_prime = java.lang.Float.NaN
var G_prime = java.lang.Float.NaN
var B_prime = java.lang.Float.NaN
if (H < 60) {
R_prime = C
G_prime = X
B_prime = 0f
}
else if (H < 120) {
R_prime = X
G_prime = C
B_prime = 0f
}
else if (H < 180) {
R_prime = 0f
G_prime = C
B_prime = X
}
else if (H < 240) {
R_prime = 0f
G_prime = X
B_prime = C
}
else if (H < 300) {
R_prime = X
G_prime = 0f
B_prime = C
}
else if (H < 360) {
R_prime = C
G_prime = 0f
B_prime = X
}
return Color(R_prime + m, G_prime + m, B_prime + m, alpha)
}
fun toRGB(hsv: HSV): Color {
return toRGB(hsv.h * 360, hsv.s, hsv.v, hsv.alpha)
}
fun fromRGB(color: Color): HSV {
val r = color.r
val g = color.g
val b = color.b
val rgbMin = FastMath.min(r, g, b)
val rgbMax = FastMath.max(r, g, b)
var h: Float
val s: Float
val v = rgbMax
val delta = rgbMax - rgbMin
if (rgbMax != 0f)
s = delta / rgbMax
else {
h = 0f
s = 0f
return HSV(h, s, v)
}
if (r == rgbMax)
h = (g - b) / delta
else if (g == rgbMax)
h = 2 + (b - r) / delta
else
h = 4 + (r - g) / delta
h *= 60f
if (h < 0) h += 360f
return HSV(h.div(360f), s, v, color.a)
}
}
/**
* @param h : Hue in 0.0 - 1.0 (360 deg)
* @param s : Saturation in 0.0 - 1.0
* @param v : Value in 0.0 - 1.0
*/
data class HSV(var h: Float = 0f, var s: Float = 0f, var v: Float = 0f, var alpha: Float = 1f)