diff --git a/roentgen/color.py b/roentgen/color.py new file mode 100644 index 0000000..cd09a56 --- /dev/null +++ b/roentgen/color.py @@ -0,0 +1,38 @@ +from typing import Any, List + +from colour import Color + +from roentgen.util import MinMax + + +def is_bright(color: Color) -> bool: + """ + Is color bright enough to have black outline instead of white. + """ + return ( + 0.2126 * color.red * 256 + + 0.7152 * color.green * 256 + + 0.0722 * color.blue * 256 > 200) + + +def get_gradient_color(value: Any, bounds: MinMax, colors: List[Color]): + """ + Get color from the color scale for the value. + + :param value: given value (should be in bounds) + :param bounds: maximum and minimum values + :param colors: color scale + """ + color_length: int = len(colors) - 1 + scale = colors + [Color("black")] + + coefficient: float = ( + 0 if bounds.max_ == bounds.min_ else + (value - bounds.min_) / (bounds.max_ - bounds.min_)) + coefficient = min(1.0, max(0.0, coefficient)) + m: int = int(coefficient * color_length) + color_coefficient = (coefficient - m / color_length) * color_length + + return Color(rgb=[ + scale[m].rgb[i] + color_coefficient * + (scale[m + 1].rgb[i] - scale[m].rgb[i]) for i in range(3)]) \ No newline at end of file diff --git a/roentgen/constructor.py b/roentgen/constructor.py index f9f5123..fa3b884 100644 --- a/roentgen/constructor.py +++ b/roentgen/constructor.py @@ -15,7 +15,8 @@ from roentgen.extract_icon import DEFAULT_SMALL_SHAPE_ID from roentgen.flinger import Flinger from roentgen.osm_reader import Map, OSMMember, OSMRelation, OSMWay, OSMNode, Tagged from roentgen.scheme import IconSet, Scheme -from roentgen.util import MinMax, get_gradient_color +from roentgen.util import MinMax +from roentgen.color import get_gradient_color DEBUG: bool = False TIME_COLOR_SCALE: List[Color] = [ diff --git a/roentgen/mapper.py b/roentgen/mapper.py index 4b7fdc9..4b5f52c 100644 --- a/roentgen/mapper.py +++ b/roentgen/mapper.py @@ -25,7 +25,8 @@ from roentgen.osm_getter import get_osm from roentgen.osm_reader import Map, OSMReader from roentgen.scheme import Scheme from roentgen.direction import DirectionSet, Sector -from roentgen.util import MinMax, is_bright +from roentgen.util import MinMax +from roentgen.color import is_bright ICONS_FILE_NAME: str = "icons/icons.svg" TAGS_FILE_NAME: str = "data/tags.yml" diff --git a/roentgen/util.py b/roentgen/util.py index 89280ed..65cea9b 100644 --- a/roentgen/util.py +++ b/roentgen/util.py @@ -1,8 +1,3 @@ -from typing import Any, List - -from colour import Color - - class MinMax: """ Minimum and maximum. @@ -29,36 +24,3 @@ class MinMax: Get middle point between minimum and maximum. """ return (self.min_ + self.max_) / 2 - - -def is_bright(color: Color) -> bool: - """ - Is color bright enough to have black outline instead of white. - """ - return ( - 0.2126 * color.red * 256 + - 0.7152 * color.green * 256 + - 0.0722 * color.blue * 256 > 200) - - -def get_gradient_color(value: Any, bounds: MinMax, colors: List[Color]): - """ - Get color from the color scale for the value. - - :param value: given value (should be in bounds) - :param bounds: maximum and minimum values - :param colors: color scale - """ - color_length: int = len(colors) - 1 - scale = colors + [Color("black")] - - coefficient: float = ( - 0 if bounds.max_ == bounds.min_ else - (value - bounds.min_) / (bounds.max_ - bounds.min_)) - coefficient = min(1.0, max(0.0, coefficient)) - m: int = int(coefficient * color_length) - color_coefficient = (coefficient - m / color_length) * color_length - - return Color(rgb=[ - scale[m].rgb[i] + color_coefficient * - (scale[m + 1].rgb[i] - scale[m].rgb[i]) for i in range(3)])