PHP:imagettftext&;imagettfbbox-单词碰撞检测

PHP:imagettftext&;imagettfbbox-单词碰撞检测,php,collision-detection,truetype,Php,Collision Detection,Truetype,我有一个数组中的单词列表,我可以使用imagettftext将其写入PNG imagettfbbox用于确定下一个单词的位置 我想检查我试图写入图像的当前单词是否与之前已写入的单词重叠(我假设imagettfbbox是正确的方法?) 下面是我假设代码的样子(我不知道怎么做!): 目前,我的代码将把所有单词写入一个没有重叠的图像,但没有任何角度(这是我希望它在将来处理的事情——没有单词冲突) 正如您所看到的,这段代码目前是相当静态的,并且不会将文字限制在图像的大小内(这也是我想要的) 任何帮助都将

我有一个数组中的单词列表,我可以使用imagettftext将其写入PNG

imagettfbbox用于确定下一个单词的位置

我想检查我试图写入图像的当前单词是否与之前已写入的单词重叠(我假设imagettfbbox是正确的方法?)

下面是我假设代码的样子(我不知道怎么做!):

目前,我的代码将把所有单词写入一个没有重叠的图像,但没有任何角度(这是我希望它在将来处理的事情——没有单词冲突)

正如您所看到的,这段代码目前是相当静态的,并且不会将文字限制在图像的大小内(这也是我想要的)


任何帮助都将不胜感激,在过去的两周里,我一直坚持这一点,我真的很想继续前进

我很久没有做过这个了,但很久以前我写过一个图像处理类。下面是我的函数中执行类似任务的一个片段。我的整个功能实际上包括垂直、居中、左/右对齐、粗体、TTF/非TTF和换行(以及它们的任何逻辑组合)。如果需要换行,则必须先对字符串进行计算,并将其拆分为一系列行,然后再处理边界框

此代码位于迭代分解字符串的foreach循环中。这是一个可以像你一样进行长方体计算的部分。看起来很相似,但我的算法有点不同

// Calculate Deviation
$dx = ($box[2] - $box[0]) / 2 - ($box[2] - $box[4]) / 2; // Left-Right
$dy = ($box[3] - $box[1]) / 2 + ($box[7] - $box[1]) / 2; // Top-Bottom

// Some calculations for alignments were here

// Draw the text
$success = imagettftext($this->image, $this->settings['font'], (int)$angle, $x, $y, $color, $font_file, $string);
如果您对我描述的其他功能感兴趣,我可以提供完整的功能。它使用位掩码作为标志。老实说,我不记得它是否能很好地处理角度,但我认为它基本上做到了


希望这会有帮助。

我花了一段时间,但我发现了

我就是这样做的:

其中$i是要写入图像的单词的编号

do{
    $startx += ($i / 2 * cos($i));
    $starty += ($i / 2 * sin($i));
}while(intersection($boundingbox, $startx, $starty, $previouscoordinates, $i));

intersects方法获取要写入的当前单词、其边界框坐标、开始(x,y)以及已写入图像的先前单词的所有坐标。该方法检查当前要书写的单词是否与此起始点(x,y)之前的任何单词相交。

我也尝试过使用此方法,但它似乎仍然不适用于我!你能再给我看看你的节目吗?谢谢你知道吗,我刚刚注意到在那段代码中,
$dx
$dy
从未被使用过。。。它们实际上是从
$x
$y
中减去的,但是这一行被注释掉了,所以我想知道我是否有一些问题。这是我的全部方法;它使用了大量的类变量,但它们应该是自解释的,以满足您的需要。我想您可能更感兴趣的是,在每行写入之后,行距设置会增加多少行。这应该是很好的评论你。
// Calculate Deviation
$dx = ($box[2] - $box[0]) / 2 - ($box[2] - $box[4]) / 2; // Left-Right
$dy = ($box[3] - $box[1]) / 2 + ($box[7] - $box[1]) / 2; // Top-Bottom

// Some calculations for alignments were here

// Draw the text
$success = imagettftext($this->image, $this->settings['font'], (int)$angle, $x, $y, $color, $font_file, $string);
do{
    $startx += ($i / 2 * cos($i));
    $starty += ($i / 2 * sin($i));
}while(intersection($boundingbox, $startx, $starty, $previouscoordinates, $i));