Выравнивание прямоугольников внутри круга и вращение

У меня есть программа, которая генерирует изображение.

Это места x изображения вокруг круга с x длина окружности.

Ниже приведен вывод текущей реализации.
Пример текущей реализации

Мне нужно, чтобы все прямоугольники были внутри круга и были расположены равномерно.

Обратите внимание, что на изображении выше, в текущей реализации, некоторые из прямоугольников находятся внутри, а некоторые — снаружи.

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

 /**
* Draw the points around a circle
* @param  $count
* @param  $circumference
*/
public function drawWheel($count, $circumference)
{
/**
* The starting angle
*/
$angle = 0;

/**
* The starting step between rectangles
*/
$step = (2 * pi()) / $count;

/**
* The center X of the canvas
*/
$startX = ($this->canvas['width'] / 2);

/**
* The center Y of the canvas
*/
$startY = ($this->canvas['height'] / 2);for ($i = 0; $i < $count; $i++) {
/**
* Width of rectangle
*/
$width = 85;

/**
* Height of rectangle
*/
$height = 41;

/**
* Rectangle X position
*/
$x = ($startX + ($circumference / 2) * cos($angle)) - $width / 2;

/**
* Rectangle Y position
*/
$y = ($startY + ($circumference / 2) * sin($angle)) - $height / 2;

/**
* Degrees to rotate the rectangle around the circle
*/
$rotateAngle = atan2((($startX - ($width / 2)) - $x), (($startY - ($height)) - $y)) * 180 / pi();

/**
* The rectangle image
*/
$watermark = Image::make(base_path('test.png'));

$watermark->opacity(75);
$watermark->resize($width, $height);
$watermark->rotate($rotateAngle);

$this->image->insert($watermark, 'top-left', ceil($x), ceil($y));

/**
* Increment the angle
*/
$angle += $step;
}
}

Часть функции, которая делает вычисления, приведена ниже.

$x = ($startX + ($circumference / 2) * cos($angle)) - $width / 2;

$y = ($startY + ($circumference / 2) * sin($angle)) - $height / 2;

$rotateAngle = atan2((($startX - ($width / 2)) - $x), (($startY - ($height)) - $y)) * 180 / pi();

Точка вращения является центром прямоугольника.

Изображение поворачивается с помощью: http://php.net/manual/en/function.imagerotate.php

Круг нарисован с использованием: http://php.net/manual/en/function.imagefilledarc.php

1

Решение

Эти строки подозрительны:

$x = ($startX + ($circumference / 2) * cos($angle)) - $width / 2;
$y = ($startY + ($circumference / 2) * sin($angle)) - $height / 2;

Чтобы разместить центр прямоугольника внутри круга на внутреннем радиусе, вы должны использовать что-то вроде этого:

$x = ($startX + (($circumference - $height) / 2) * cos($angle));
$y = ($startY + (($circumference - $height) / 2) * sin($angle));

И угол поворота просто

$rotateAngle = $angle * 180 / Pi - 90; // probably $angle+90 depending on coordinate system

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

Fi = rotateAngle * Pi / 80
New_Height = $width * Abs(Sin(Fi)) + $height * Abs(Cos(Fi))
New_Width = $width * Abs(Cos(Fi)) + $height * Abs(Sin(Fi))

Исправьте $ x и $ y для правильного вывода:

$x = $x - New_Width/2
$y = $y - New_Height/2
1

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

Ширина / высота будет изменена после поворота прямоугольника, это то, что я не учитывал.

Ответ MBo помог с основными координатами x, y и вращением.

Смотрите исправленный код ниже.

for ($i = 0; $i < $count; $i++) {
$width = 85;
$height = 41;

$x = ($startX + (($circumference - $height) / 2) * cos($angle));
$y = ($startY + (($circumference - $height) / 2) * sin($angle));

$rotateAngle = 90 - $angle * 180 / pi();

$watermark = Image::make(base_path('test.png'));

$watermark->opacity(75);
$watermark->resize($width, $height);
$watermark->rotate($rotateAngle);

$this->image->insert($watermark, 'top-left', ceil($x - ($watermark->width() / 2)), ceil($y - ($watermark->height() / 2)));

$this->drawCircle($x, $y, 10);
$this->drawCircle($x, $y, 10);$angle += $step;
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector