我需要使用 PHP 的图像库绘制类似地铁 map (沿同一路径的多条路线)的东西。这是一个例子:
********* ******** * ******* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ******************** * ********************* **********************
沿着这条路径画一条线很容易。我不知道如何沿着路径绘制多条线,但它们之间的间距相等。
最佳答案
对于给定的点 A 和通过它的更多线,对于第一个点,您必须决定点是在轨道“内部”(B) 还是“外部”(C):
********C
D******A *
Q*****B * *
* * *
* E *
现在,您可以计算 B 点到 A 点的偏移量,作为长度 = 偏移量(例如 5px)沿着角度的路径,这是“内部”B 的 AE 和 AD 之间顺时针角度的一半(或者对于“外部”C,从 AD 到 AE 的顺时针角度,或者稍后使用负偏移)。您需要点 B 沿着通过 A 的线与 A 相距 5px,角度为 angle AE + ((angle AD - angle AE)/2)
我绝不是数学高手,而且我唯一一次需要像在 javascript 中那样计算角度,我将以它为例,请根据需要重写为 PHP(任何会这样做的人) 了解数学,请在需要时随意大笑和纠正):
var dx = b.x - a.x;
var dy = b.y - a.y;
if(dx == 0 && dy == 0){
answer = 0;
} else if(dx > 0 && dy >= 0 ){
answer = Math.atan(dy/dx);
} else if(dx <= 0 && dy > 0){
answer = Math.atan(dx/dy) + (Math.PI * 0.5);
} else if(dx <= 0 && dy <= 0){
answer = Math.atan(dy/dx) + Math.PI;
} else if(dx >= 0 && dy <= 0){
answer = Math.atan(dy/dx) + (Math.PI * 1.5);
}
因此,在 D=(0,10),A=(10,10), E=(20,20) 的网格中:
- 通过 AE 的角度 = 45° (PI/4 rad),通过 AD = 180° (PI rad)
- 然后通过 AB 的角度为
(45 + ((180-45)/2))
=> 112.5° (5/8 PI rad) - 从 A=(10,10) 到角度 112.5° 的 5 像素偏移为您提供了 B 的位置:
Bx = Ax + (cos(angle) * 5) = +/- 8.1
By = Ay + (sin(angle) * 5) = +/- 14.6
- 在起点 D 旁边的“兄弟”点 Q,您没有先前的路径可以引用/计算角度,所以我取垂直线:角度 DQ = 角度 DA + 90° (PI/2 rad)(在这个例子中你可以只做 Dy+5,但也许你并不总是平行于 2 轴之一开始)
- 冲洗并重复所有其他点,在计算出的坐标之间画线。
关于php - 沿路径绘制平行线 - PHP GD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3824618/