Skip to content

Commit

Permalink
Issue #11: move color utility to separate module.
Browse files Browse the repository at this point in the history
  • Loading branch information
enzet committed Sep 20, 2020
1 parent aee36d0 commit 557e0d1
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 40 deletions.
38 changes: 38 additions & 0 deletions roentgen/color.py
Original file line number Diff line number Diff line change
@@ -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)])
3 changes: 2 additions & 1 deletion roentgen/constructor.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@
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] = [
Expand Down
3 changes: 2 additions & 1 deletion roentgen/mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
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"
Expand Down
38 changes: 0 additions & 38 deletions roentgen/util.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
from typing import Any, List

from colour import Color


class MinMax:
"""
Minimum and maximum.
Expand All @@ -29,36 +24,3 @@ def center(self):
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)])

0 comments on commit 557e0d1

Please sign in to comment.