RedeyeVentures\GeoPattern\GeoPattern::geoTessellation PHP Метод

geoTessellation() защищенный Метод

protected geoTessellation ( )
    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;
            }
        }
    }