protected function geoTessellation()
{
$sideLength = $this->map($this->hexVal(0, 1), 0, 15, 5, 40);
$hexHeight = $sideLength * sqrt(3);
$hexWidth = $sideLength * 2;
$triangleHeight = $sideLength / 2 * sqrt(3);
$triangle = $this->buildRotatedTriangleShape($sideLength, $triangleHeight);
$tileWidth = $sideLength * 3 + $triangleHeight * 2;
$tileHeight = $hexHeight * 2 + $sideLength * 2;
$this->svg->setWidth($tileWidth)->setHeight($tileHeight);
// Doing these variables up here, so we only have to calculate them once.
$halfSideLength = $sideLength / 2;
$negativeHalfSideLength = -$sideLength / 2;
$halfTriangleHeight = $triangleHeight / 2;
$halfHexHeight = $hexHeight / 2;
$tileHeightPlusHalfSideLength = $tileHeight + $sideLength / 2;
$halfTileHeightMinusHalfSideLength = $tileHeight / 2 - $sideLength / 2;
$halfTileWidthPlusHalfSideLength = $tileWidth / 2 + $sideLength / 2;
$tileWidthMinusHalfTileWidthMinusHalfSideLength = $tileWidth - $tileWidth / 2 - $sideLength / 2;
$tileWidthMinusHalfSideLength = $tileWidth - $sideLength / 2;
$tileHeightMinusHalfHexHeight = $tileHeight - $hexHeight / 2;
$negativeTileWidthPlusHalfSideLength = -$tileWidth + $sideLength / 2;
$halfTileHeightMinusHalfSideLengthMinusSideLength = $tileHeight / 2 - $sideLength / 2 - $sideLength;
$negativeTileHeightPlusHalfTileHeightMinusHalfSideLengthMinusSideLength = -$tileHeight + $tileHeight / 2 - $sideLength / 2 - $sideLength;
$negativeTileHeightPlusHalfSideLength = -$tileHeight + $sideLength / 2;
for ($i = 0; $i <= 19; $i++) {
$val = $this->hexVal($i, 1);
$opacity = $this->opacity($val);
$fill = $this->fillColor($val);
$styles = ['stroke' => self::STROKE_COLOR, 'stroke-opacity' => self::STROKE_OPACITY, 'fill' => $fill, 'fill-opacity' => $opacity, 'stroke-width' => 1];
switch ($i) {
case 0:
# all 4 corners
$this->svg->addRectangle(-$sideLength / 2, -$sideLength / 2, $sideLength, $sideLength, $styles);
$this->svg->addRectangle($tileWidth - $sideLength / 2, -$sideLength / 2, $sideLength, $sideLength, $styles);
$this->svg->addRectangle(-$sideLength / 2, $tileHeight - $sideLength / 2, $sideLength, $sideLength, $styles);
$this->svg->addRectangle($tileWidth - $sideLength / 2, $tileHeight - $sideLength / 2, $sideLength, $sideLength, $styles);
break;
case 1:
# center / top square
$this->svg->addRectangle($hexWidth / 2 + $triangleHeight, $hexHeight / 2, $sideLength, $sideLength, $styles);
break;
case 2:
# side squares
$this->svg->addRectangle(-$sideLength / 2, $tileHeight / 2 - $sideLength / 2, $sideLength, $sideLength, $styles);
$this->svg->addRectangle($tileWidth - $sideLength / 2, $tileHeight / 2 - $sideLength / 2, $sideLength, $sideLength, $styles);
break;
case 3:
# center / bottom square
$this->svg->addRectangle($hexWidth / 2 + $triangleHeight, $hexHeight * 1.5 + $sideLength, $sideLength, $sideLength, $styles);
break;
case 4:
# left top / bottom triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$halfSideLength}, {$negativeHalfSideLength}) rotate(0, {$halfSideLength}, {$halfTriangleHeight})"]));
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$halfSideLength}, {$tileHeightPlusHalfSideLength}) rotate(0, {$halfSideLength}, {$halfTriangleHeight}) scale(1, -1)"]));
break;
case 5:
# right top / bottom triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$tileWidthMinusHalfSideLength}, {$negativeHalfSideLength}) rotate(0, {$halfSideLength}, {$halfTriangleHeight}) scale(-1, 1)"]));
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$tileWidthMinusHalfSideLength}, {$tileHeightPlusHalfSideLength}) rotate(0, {$halfSideLength}, {$halfTriangleHeight}) scale(-1, -1)"]));
break;
case 6:
# center / top / right triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$halfTileWidthPlusHalfSideLength}, {$halfHexHeight})"]));
break;
case 7:
# center / top / left triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$tileWidthMinusHalfTileWidthMinusHalfSideLength}, {$halfHexHeight}) scale(-1, 1)"]));
break;
case 8:
# center / bottom / right triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$halfTileWidthPlusHalfSideLength}, {$tileHeightMinusHalfHexHeight}) scale(1, -1)"]));
break;
case 9:
# center / bottom / left triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$tileWidthMinusHalfTileWidthMinusHalfSideLength}, {$tileHeightMinusHalfHexHeight}) scale(-1, -1)"]));
break;
case 10:
# left / middle triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$halfSideLength}, {$halfTileHeightMinusHalfSideLength})"]));
break;
case 11:
# right / middle triangle
$this->svg->addPolyline($triangle, array_merge($styles, ['transform' => "translate({$tileWidthMinusHalfSideLength}, {$halfTileHeightMinusHalfSideLength}) scale(-1, 1)"]));
break;
case 12:
# left / top square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "translate({$halfSideLength}, {$halfSideLength}) rotate(-30, 0, 0)"]));
break;
case 13:
# right / top square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "scale(-1, 1) translate({$negativeTileWidthPlusHalfSideLength}, {$halfSideLength}) rotate(-30, 0, 0)"]));
break;
case 14:
# left / center-top square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "translate({$halfSideLength}, {$halfTileHeightMinusHalfSideLengthMinusSideLength}) rotate(30, 0, {$sideLength})"]));
break;
case 15:
# right / center-top square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "scale(-1, 1) translate({$negativeTileWidthPlusHalfSideLength}, {$halfTileHeightMinusHalfSideLengthMinusSideLength}) rotate(30, 0, {$sideLength})"]));
break;
case 16:
# left / center-top square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "scale(1, -1) translate({$halfSideLength}, {$negativeTileHeightPlusHalfTileHeightMinusHalfSideLengthMinusSideLength}) rotate(30, 0, {$sideLength})"]));
break;
case 17:
# right / center-bottom square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "scale(-1, -1) translate({$negativeTileWidthPlusHalfSideLength}, {$negativeTileHeightPlusHalfTileHeightMinusHalfSideLengthMinusSideLength}) rotate(30, 0, {$sideLength})"]));
break;
case 18:
# left / bottom square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "scale(1, -1) translate({$halfSideLength}, {$negativeTileHeightPlusHalfSideLength}) rotate(-30, 0, 0)"]));
break;
case 19:
# right / bottom square
$this->svg->addRectangle(0, 0, $sideLength, $sideLength, array_merge($styles, ['transform' => "scale(-1, -1) translate({$negativeTileWidthPlusHalfSideLength}, {$negativeTileHeightPlusHalfSideLength}) rotate(-30, 0, 0)"]));
break;
}
}
}