我试图将一行已知宽度的文本沿着指定为起点和终点坐标的行居中。
目的是在多边形周围编写文本,因此这些线并不总是水平的。
目前我有以下函数,它取一行的起始x和y以及结束的x和y以及文本的宽度(以像素为单位)。
文本将从x1,y1开始以正确的角度绘制,以跟随该行。
要将此文本居中于我尝试计算左边距(以像素为单位)的行,应将其应用于x1,y1以使文本从左边原点移动正确的数量。
以下函数是我尝试修改坐标以实现上述概念。但它不太正确。我最终略微偏离文字,有时x有时是y,取决于脸部,但x或y都不正确。
private function CenterTextOnLine(&$x1, &$y1, &$x2, &$y2, $width)
{
$distance = $this->getDistance($x1, $y1, $x2, $y2);
//calculate the left padding required in pixels
$padding = ($distance - $width) / 2;
//what factor do we need to alter x1, y1 by?
$factor = ($distance / $padding);
$gradient = ($y2-$y1)/($x2-$x1); //gradient to alter y by
$x1 += abs($x2-$x1) / $factor; //move start x by factor
$y1 += ($gradient / $factor); //add factor of gradient to start y
return;
}
如果有人能看到我的错误,或者为此目的知道算法,我将非常感谢您的意见。
感谢您的时间。
答案 0 :(得分:0)
我认为这应该有效:
$y1 += ($y2-$y1)/$factor;
$k = $how_much_distance_I_want/sqrt(1+$gradient*$gradient);
$x1 += $k*$gradient;
$y1 -= $k;
return;
当你在这里时,我认为
中的abs
$x1 += abs($x2-$x1) / $factor;
如果($x2-$x1)
为负数,可能会导致意外结果(可能最好不要使用abs
),并且根据php如何处理无穷大,您可能希望制定案例计划$factor === 0
。