php - 沿路径绘制平行线 - PHP GD

标签 php path drawing

我需要使用 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/

相关文章:

android - Flutter Pub : Expected a key while parsing a block mapping. 路径:

Ruby 在与源相同的目录中加载配置(yaml)文件

react-native - 如何在 React Native 中制作交互式绘图应用程序?

javascript - 默认情况下如何更改绘图管理器选择选项?

javascript - 绘制线条网页

php - 将整个类作为另一个类中的参数传递

php - 在 Notepad++ 中使用 MySQLi 函数需要包括哪些内容?

windows - 批处理脚本 - 循环中的动态/变量路径

php - 无法将数据保存到数据库cakephp

PHP while(true) 循环用于文件更新