Support crater drawing.

This commit is contained in:
Sergey Vartanov 2021-09-01 03:05:41 +03:00
parent 7fcfc85d44
commit 2f80f532ef
6 changed files with 69 additions and 10 deletions

View file

@ -145,12 +145,12 @@
inkscape:object-paths="true"
inkscape:guide-bbox="true"
showguides="false"
showgrid="false"
showgrid="true"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:cy="552.05466"
inkscape:cx="725.47613"
inkscape:zoom="1"
inkscape:cy="574.09971"
inkscape:cx="310.47613"
inkscape:zoom="45.254834"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
borderopacity="1.0"
@ -22742,5 +22742,21 @@
<title
id="title7808">orbiter</title>
</path>
<path
style="opacity:0.2;fill:none;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
d="m 306.5,12.5 11,0 c -1.5,-1 -1.5,-2 -2,-3 -2,1.5 -5,1.5 -7,0 -0.5,1 -0.5,2 -2,3 z"
id="path7810"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 308.47266,25 c -0.17969,0.01014 -0.34006,0.116064 -0.41993,0.277344 -0.55962,1.119257 -0.45808,1.891979 -1.83007,2.80664 C 305.81126,28.358467 306.00544,28.999813 306.5,29 l 11,0 c 0.49456,-1.87e-4 0.68874,-0.641533 0.27734,-0.916016 -1.37199,-0.914661 -1.27045,-1.687383 -1.83007,-2.80664 -0.13896,-0.28007 -0.49797,-0.36537 -0.74805,-0.177735 -1.808,1.356 -4.59044,1.356 -6.39844,0 -0.0942,-0.07084 -0.21043,-0.106117 -0.32812,-0.09961 z"
id="crater"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccc"
inkscape:label="#path7812">
<title
id="title7816">crater</title>
</path>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View file

@ -11,7 +11,14 @@ from colour import Color
from roentgen import ui
from roentgen.color import get_gradient_color
from roentgen.figure import Building, DirectionSector, Road, StyledFigure, Tree
from roentgen.figure import (
Building,
Crater,
DirectionSector,
Road,
StyledFigure,
Tree,
)
from roentgen.flinger import Flinger
from roentgen.map_configuration import DrawingMode, MapConfiguration
@ -159,6 +166,7 @@ class Constructor:
self.buildings: list[Building] = []
self.roads: list[Road] = []
self.trees: list[Tree] = []
self.craters: list[Crater] = []
self.direction_sectors: list[DirectionSector] = []
self.heights: set[float] = {2, 4}
@ -411,6 +419,10 @@ class Constructor:
self.trees.append(Tree(tags, node.coordinates, flung))
return
if node.get_tag("natural") == "crater" and "diameter" in node.tags:
self.craters.append(Crater(tags, node.coordinates, flung))
return
if "direction" in node.tags or "camera:direction" in node.tags:
self.direction_sectors.append(DirectionSector(tags, flung))
point: Point = Point(

View file

@ -247,6 +247,33 @@ class Road(Figure):
pass
class Crater(Tagged):
"""
Volcano or impact crater on the map.
"""
def __init__(
self, tags: dict[str, str], coordinates: np.ndarray, point: np.ndarray
) -> None:
super().__init__(tags)
self.coordinates: np.ndarray = coordinates
self.point: np.ndarray = point
def draw(self, svg: Drawing, flinger: Flinger) -> None:
"""Draw crater ridge."""
scale: float = flinger.get_scale(self.coordinates)
assert "diameter" in self.tags
radius: float = float(self.tags["diameter"]) / 2.0
circle = svg.circle(
self.point,
radius * scale,
fill="none",
stroke="#000000",
opacity=0.3,
)
svg.add(circle)
class Tree(Tagged):
"""
Tree on the map.

View file

@ -357,19 +357,18 @@ class Icon:
:param tags: tags to be displayed as hint
:param outline: draw outline for the icon
"""
target = Group(opacity=self.opacity) if self.opacity != 1.0 else svg
if outline:
bright: bool = is_bright(self.shape_specifications[0].color)
opacity: float = 0.7 if bright else 0.5
outline_group: Group = Group(opacity=opacity)
for shape_specification in self.shape_specifications:
shape_specification.draw(outline_group, point, tags, True)
target.add(outline_group)
svg.add(outline_group)
else:
group: Group = Group(opacity=self.opacity)
for shape_specification in self.shape_specifications:
shape_specification.draw(target, point, tags)
if self.opacity != 1.0:
svg.add(target)
shape_specification.draw(group, point, tags)
svg.add(group)
def draw_to_file(
self,

View file

@ -80,6 +80,8 @@ class Map:
for tree in constructor.trees:
tree.draw(self.svg, self.flinger, self.scheme)
for tree in constructor.craters:
tree.draw(self.svg, self.flinger)
for direction_sector in constructor.direction_sectors:
direction_sector.draw(self.svg, self.scheme)

View file

@ -212,6 +212,9 @@ node_icons:
shapes: [cliff]
- tags: {natural: peak}
shapes: [triangle_small]
- tags: {natural: crater}
exception: {diameter: "*"}
shapes: [crater]
- tags:
natural: volcano