【问题标题】:PHP GD basic rectangle offset mathsPHP GD 基本矩形偏移数学
【发布时间】:2013-05-31 13:57:29
【问题描述】:

我完全被一些我认为解决起来相对简单的事情所困扰:

在 PHP 中,我在图像顶部绘制填充矩形(使用 GD)-我希望它们之间有一个小间隙-在代码中指定(每个框的间隙相同)-我循环直到我已经达到了一行中矩形的最大数量(例如最大列) - 我已经管理了水平间隙偏移,但是对于我的生活来说,我无法计算出垂直间隙的数学。

这是我的完整代码: http://pastebin.com/MHUqi0tG

但特别是 PHP 接受两组坐标来制作一个矩形 - 左上角(x 和 y)两个坐标,右下角(x 和 y)两个坐标。

这是我的代码:

        $left_wall_of_box_x = ( $current_col * $box_size ) + $origin_x ;


        if($last_block_x != $origin_x){

            $left_wall_of_box_x = $last_block_x + $gap;

        }

        /*verticals coord 1*/
        $left_wall_of_box_y = ( $current_row * $box_size ) + $origin_y;




        $right_wall_x = $left_wall_of_box_x + $box_size ;
        $right_wall_y = $left_wall_of_box_y + $box_size;





        imagefilledrectangle($im, $left_wall_of_box_x, $left_wall_of_box_y, $right_wall_x, $right_wall_y, $red);

$gap = 2; $origin_x & origin_y = 我开始画盒子的地方。

目前的输出是在水平轴上很好地分开的框,但在垂直方向上它们相互碰撞/合并在一起。

任何帮助显然都非常感谢 - 在这方面扯掉头发。 谢谢

【问题讨论】:

    标签: php math coordinates rectangles


    【解决方案1】:

    错误就在这里:

    $left_wall_of_box_y = ( $current_row * $box_size ) + $origin_y;
    

    应该是:

    $left_wall_of_box_y = ( $current_row * ($box_size + $gap_vertical)) + $origin_y;
    

    但是您的代码很脆弱且难以阅读。它很脆弱,因为您让您的计算更多地依赖于代表微妙不同事物的变量,并且随着变量的增多,您更难以适应 - 这就是您没有发现错误的部分原因。

    所以,不要这样做:

    while($x <= $total_boxes_to_draw)
    {                           
        if($current_col >= $cols)
        {
        //reset to start of row
        }
    }
    

    这样写你的代码。

    $finished = false;
    
    for ($y=0; ($y<$rows) && ($finished==false) ; $y++) 
    {
        $yPosition = $origin_y + $y * ($box_size + $spacing_vertical);
        for ($x=0 ; $x<$cols && ($finished==false) ; $x++) 
        {
            $xPosition = $origin_x + $x * ($box_size + $spacing_horizontal);
    
            //draw box at $xPosition, $yPosition
    
            $boxesDrawn++;
            if ($boxesDrawn >= $total_boxes_to_draw){
                $finished = true;
            }
        }
    }
    

    【讨论】:

    • 关于混乱代码的完美和非常好的观点 - 我认为它根本没有帮助!
    【解决方案2】:

    您是在水平方向添加间隙,但也必须在垂直方向添加。

    一个简单的解决方法是从您填充的矩形的高度中减去间隙:

    imagefilledrectangle($im, $left_wall_of_box_x, $left_wall_of_box_y, 
                         $right_wall_x, $right_wall_y - gap, $red);
    

    【讨论】:

    • 记录在案 - 这非常有效,但我更喜欢另一个答案,因为它确实突出了我这样做的严重错误 - 无论如何谢谢
    • 确实,结构良好的代码更容易发现和纠正错误。
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多