对齐圆圈内部的矩形并旋转

时间:2016-01-27 10:31:25

标签: php math geometry computational-geometry

我有一个生成图像的程序。

它会将x张图片放在周长为x的圆圈周围。

见下面当前实现的输出。  Current implementation example

我需要将所有矩形放在圆圈内并均匀放置。

请注意,在上图中,当前实现中,一些矩形在内部,一些在外部。

我不确定我的计算有什么问题,请参阅下面的代码来放置矩形。

 /**
 * 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

绘制圆圈

2 个答案:

答案 0 :(得分: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 :(得分:0)

一旦旋转矩形,宽度/高度将被翻转,这是我没有考虑的因素。

MBo的答案有助于主要的x,y和旋转坐标。

见下面的修改代码。

packageName()