<?php
class Circle
{
private $start;
private $is_clockwise;
private $start_direction;
private $is_asc;
private $width;
private $arr;
public function __construct($params)
{
$this->start = $params['start'];
$this->is_clockwise = isset($params['is_clockwise']) ? $params['is_clockwise'] : 0;
$this->start_direction = isset($params['start_direction']) ? $params['start_direction'] : 1;
$this->is_asc = isset($params['is_asc']) ? $params['is_asc'] : 1;
$this->width = $params['width'];
}
public function getNums()
{
$i = 1;
$p1 = $this->start;
$circle_top = ceil($this->width / 2);
if ($this->is_asc == 1) {
$num_end = $this->width * $this->width + $this->start;
while ($i <= $circle_top && $p1 <= $num_end) {
if ($this->is_clockwise == 1) {
$this->arr[$i - 1][$i - 1] = $p1;
$p2 = $this->hor_add($p1 + 1, $i - 1, $i, $this->width - 2 * $i + 1);
$p3 = $this->ver_add($p2, $i, $this->width - $i, $this->width - 2 * $i + 1);
$p4 = $this->hor_reduce($p3, $this->width - $i, $this->width - $i - 1, $this->width - 2 * $i + 1);
$p1 = $this->ver_reduce($p4, $this->width - $i - 1, $i - 1, $this->width - 2 * $i);
$i++;
} else {
$this->arr[$i - 1][$i - 1] = $p1;
$p2 = $this->ver_add($p1 + 1, $i, $i - 1, $this->width - 2 * $i + 1);
$p3 = $this->hor_add($p2, $this->width - $i, $i, $this->width - 2 * $i + 1);
$p4 = $this->ver_reduce($p3, $this->width - $i - 1, $this->width - $i, $this->width - 2 * $i + 1);
$p1 = $this->hor_reduce($p4, $i - 1, $this->width - $i - 1, $this->width - 2 * $i);
$i++;
}
}
} else {
$num_end = $this->start - $this->width * $this->width;
while ($i <= $circle_top && $p1 >= $num_end) {
if ($this->is_clockwise == 1) {
$this->arr[$i - 1][$i - 1] = $p1;
$p2 = $this->hor_add($p1 - 1, $i - 1, $i, $this->width - 2 * $i + 1);
$p3 = $this->ver_add($p2, $i, $this->width - $i, $this->width - 2 * $i + 1);
$p4 = $this->hor_reduce($p3, $this->width - $i, $this->width - $i - 1, $this->width - 2 * $i + 1);
$p1 = $this->ver_reduce($p4, $this->width - $i - 1, $i - 1, $this->width - 2 * $i);
$i++;
} else {
$this->arr[$i - 1][$i - 1] = $p1;
$p2 = $this->ver_add($p1 - 1, $i, $i - 1, $this->width - 2 * $i + 1);//var_dump($this->arr,$p2);die;
$p3 = $this->hor_add($p2, $this->width - $i, $i, $this->width - 2 * $i + 1);
$p4 = $this->ver_reduce($p3, $this->width - $i - 1, $this->width - $i, $this->width - 2 * $i + 1);
$p1 = $this->hor_reduce($p4, $i - 1, $this->width - $i - 1, $this->width - 2 * $i);
$i++;
}
}
}
foreach ($this->arr as $key => $item) {
ksort($item);
$this->arr[$key] = $item;
}
$this->rotate();
$this->dump($this->arr);
}
private function hor_add($start, $x, $y, $num)
{
if ($this->is_asc == 1) {
for ($i = $start; $i < $start + $num; $i++) {
$this->arr[$x][$y] = $i;
++$y;
}
return $start + $num;
} else {
for ($i = $start; $i > $start - $num; $i--) {
$this->arr[$x][$y] = $i;
++$y;
}
return $start - $num;
}
}
private function ver_add($start, $x, $y, $num)
{
if ($this->is_asc == 1) {
for ($i = $start; $i < $start + $num; $i++) {
$this->arr[$x][$y] = $i;
++$x;
}
return $start + $num;
} else {
for ($i = $start; $i > $start - $num; $i--) {
$this->arr[$x][$y] = $i;
++$x;
}
return $start - $num;
}
}
private function hor_reduce($start, $x, $y, $num)
{
if ($this->is_asc == 1) {
for ($i = $start; $i < $start + $num; $i++) {
$this->arr[$x][$y] = $i;
$y--;
}
return $start + $num;
} else {
for ($i = $start; $i > $start - $num; $i--) {
$this->arr[$x][$y] = $i;
$y--;
}
return $start - $num;
}
}
private function ver_reduce($start, $x, $y, $num)
{
if ($this->is_asc == 1) {
for ($i = $start; $i < $start + $num; $i++) {
$this->arr[$x][$y] = $i;
$x--;
}
return $start + $num;
} else {
for ($i = $start; $i > $start - $num; $i--) {
$this->arr[$x][$y] = $i;
$x--;
}
return $start - $num;
}
}
private function dump($arr)
{
$len = count($arr);
$html = '<table border="1px solid silver" >';
for ($i = 0; $i < $len; ++$i) {
$html .= '<tr >';
for ($j = 0; $j < $len; ++$j) {
$html .= '<td width="50px" height="50px">' . $arr[$i][$j] . '</td>';
}
$html .= '</tr>';
}
$html .= '</table>';
echo $html;
}
private function rotate()
{
$arr = [];
if ($this->start_direction == 1) {
return;
} else if ($this->start_direction == 3) {
$arr = $this->arr;
for ($i = 0; $i < $this->width; ++$i) {
for ($j = 0; $j < $this->width; ++$j) {
$this->arr[$i][$j] = $arr[$i][$this->width - $j - 1];
}
}
} else if ($this->start_direction == 2 || $this->start_direction == 4) {
for ($i = 0; $i < $this->width; ++$i) {
for ($j = 0; $j < $this->width; ++$j) {
$arr[$i][$j] = $this->arr[$j][$i];
}
}
for ($i = 0; $i < $this->width; ++$i) {
for ($j = 0; $j < $this->width; ++$j) {
if ($this->start_direction == 2) {
$this->arr[$i][$j] = $arr[$i][$this->width - $j - 1];
} else {
$this->arr[$i][$j] = $arr[$this->width - $i - 1][$j];
}
}
}
}
}
}
$num = new Circle(['is_asc' => 0, 'start' => 9, 'width' => 3, 'is_clockwise' => 1, 'start_direction' => 1]);
$num->getNums();