Как нарисовать изображение с шестигранной (заголовок) в PHP?

Я пытаюсь нарисовать гекс с помощью PHP. Я пытался следовать инструкции от http://www.redblobgames.com/grids/hexagons/ поддерживая себя с классом поколения гекса Леланд (https://github.com/pushcx/leland/blob/master/class_hex_image.php).

К сожалению, мой «гекс» выглядит так:

введите описание изображения здесь

Подскажите, пожалуйста, что я делаю не так или скажите, как мне создать правильный гекс?

Мне кажется, что функция, которая захватывает шестигранные углы, работает неправильно:

  function hex_corners($center, $size)
{
$points = array();
for($i=0; $i <= 5; $i++)
{
$deg = 60 * $i; // Oblicz kąt, w którym znajduje sie róg hexu
$rad = pi() / 180 * $deg; // Przelicz kąt na radiany
$points[$i] = array_push($points, $center['x'] + $this->size / 2 * cos($rad), $center['y'] + $this->size / 2 * sin($rad));
}
return($points);
}

но я попытался имитировать тот, который описан в http://www.redblobgames.com/grids/hexagons/ руководство:

function hex_corner(center, size, i):
var angle_deg = 60 * i
var angle_rad = PI / 180 * angle_deg
return Point(center.x + size * cos(angle_rad),
center.y + size * sin(angle_rad))

Я использую следующую функцию рисования:

public function hex_draw($x, $y)
{
$this->hex = imagecreatetruecolor ($this->size , $this->size);
$center['x'] = $this->size / 2;
$center['y'] = $this->size / 2;
$blue = imagecolorallocate($this->hex, 0, 0, 255);
// Get points
$points = $this->hex_corners($center, $this->size);
//die($print_r($points);
imagefilledpolygon($this->hex, $points, count($points)/2,  $blue);
// flush image
header('Content-type: image/png');
imagepng($this->hex);
imagedestroy($this->hex);
}

-1

Решение

Моя ошибка была тривиальной.

В соответствии

 $points[$i] = array_push($points, $center['x'] + $this->size / 2 * cos($rad), $center['y'] + $this->size / 2 * sin($rad));

там было ненужно [$i] что вызвало проблемы.

Шестнадцатеричный код может быть правильно сгенерирован с использованием следующего кода:

<?php

class hexmapimage
{

private $size = 100;
private $hex;

public function hex_draw($x, $y)
{
$this->hex = imagecreatetruecolor ($this->size , $this->size);
$center['x'] = $this->size / 2;
$center['y'] = $this->size / 2;
$black = imagecolorallocate($this->hex, 0, 0, 0);
$blue = imagecolorallocate($this->hex, 0, 0, 255);
$transparent =  imagecolortransparent ($this->hex, $black);
// Get points
$points = $this->hex_corners($center, $this->size);
imagefilledrectangle($this->hex, 0, 0, $this->size, $this->size, $transparent);
imagefilledpolygon($this->hex, $points, count($points)/2,  $blue);
// flush image
header('Content-type: image/png');
imagepng($this->hex);
imagedestroy($this->hex);
}

/*
* $center = array(x coordinate of center of hex, y coordinate of center of hex)
* $size = int (size of hex)
*/
function hex_corners($center, $size)
{
$points = array();
for($i=0; $i <= 5; $i++)
{
$deg = 60 * $i; // Oblicz kąt, w którym znajduje sie róg hexu
$rad = deg2rad($deg); // Przelicz kąt na radiany
array_push($points, $center['x'] + $this->size / 2 * cos($rad), $center['y'] + $this->size / 2 * sin($rad));
}
return($points);
}
}

$hex = new hexmapimage();
$hex->hex_draw(0, 0);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]