Решение, которое я использовал, немного сложнее. И не является общим. Нам нужно вычислить определенные вещи вручную ($ factor (вариации углов) и $ dots (количество точек для рисования на определенном радиусе)).
Но я хочу дать основные идеи для кого-то, кому нужно нечто подобное:
1 .- Мы используем уравнение, которое находит заданную точку:
0.- центральная точка: ($ x0, $ y0)
1.- радиус: $ r
2.- угол: $ угол
$x = floor($x0 + $r * sin($angle * pi() / 180));
$y = floor($y0 + $r * -cos($angle * pi() / 180));
2 .- Мы наносим точки (определенное количество точек), меняя радиус и угол
Количество точек зависит от радиуса. Больше радиуса, больше точек. Нам нужно определить функцию, которая рисует точки сектор за сектором.
3 .- Нам нужно вычислить некоторые вещи вручную ($ factor (вариации углов) и $ dots (количество точек для рисования на определенном радиусе)). Вот оно:
if ($r >= 90) {
$dots = 4;
$factor = 12.1;
}
if ($r >= 100) {
$dots = 4;
$factor = 12.4;
}
if ($r >= 110) {
$dots = 5;
$factor = 8.4;
}
if ($r >= 120) {
$dots = 6;
$factor = 6.2;
}
if ($r >= 130) {
$dots = 7;
$factor = 5.2;
}
if ($r >= 140) {
$dots = 8;
$factor = 4.4;
}
if ($r >= 150) {
$dots = 9;
$factor = 3.8;
}
if ($r >= 200) {
$dots = 10;
$factor = 3.40;
}
if ($r >= 220) {
$dots = 11;
$factor = 3.0;
}
Это основные идеи, чтобы решить это, хитрым способом.
4 . Очевидно, этот код (внутри функции) должен вызываться внутри вложенных циклов (в моем случае 3)
function plot($sector, $start) {
....
}
$ start - угол от начала рисования: 0, 30, 60, ..., 330
??? ОК, вот функция. Наслаждайтесь:
function plot($sector, $start) {
static $static;
$x0 = 0;
$y0 = 0;
if ( ! isset($static[$sector])) {
/*
* factor: related to the amplitude of the arc on which dots are drawn. (11.1 -> 3.0)
* dots: how many dots draw towards the right. (3 -> 10)
* r: radius in pixels. (60 -> 240)
* jstatic: save last position of dot drawn.
*
*/
$static[$sector]['factor'] = 11.1;
$static[$sector]['dots'] = 4;
$static[$sector]['r'] = 60;
$static[$sector]['jstatic'] = 0;
}
$factor = $static[$sector]['factor'];
$dots = $static[$sector]['dots'];
$r = $static[$sector]['r'];
$jstatic = $static[$sector]['jstatic'];
for ($j = $jstatic; $j < $dots; $j ++ ) {
if ($r >= 90) {
$dots = 4;
$factor = 12.1;
}
if ($r >= 100) {
$dots = 4;
$factor = 12.4;
}
if ($r >= 110) {
$dots = 5;
$factor = 8.4;
}
if ($r >= 120) {
$dots = 6;
$factor = 6.2;
}
if ($r >= 130) {
$dots = 7;
$factor = 5.2;
}
if ($r >= 140) {
$dots = 8;
$factor = 4.4;
}
if ($r >= 150) {
$dots = 9;
$factor = 3.8;
}
if ($r >= 200) {
$dots = 10;
$factor = 3.40;
}
if ($r >= 220) {
$dots = 11;
$factor = 3.0;
}
if ($j == $dots - 1) {
$j = 0;
$jstatic = 0;
// increase radius (by 10 pixels --each dot have 7 pixel of diameter) to the next arc.
$r = $r + 10;
}
// stop if circumference is reached.
if ($r > 240)
break;
$angle = $factor * $j + $start;
// (x, y) is...
$x = floor($x0 + $r * sin($angle * pi() / 180));
$y = floor($y0 + $r * -cos($angle * pi() / 180));
$pos['x'] = $x;
$pos['y'] = $y;
$jstatic ++;
// save all dat by each sector
$static[$sector]['factor'] = $factor;
$static[$sector]['dots'] = $dots;
$static[$sector]['r'] = $r;
$static[$sector]['jstatic'] = $jstatic;
/*
* only for debugging:
* counting how many dots are drawn
static $countDots = 0;
global $countDots;
$countDots++;
*/
return $pos;
}
}