【问题标题】:Corridor path by line path and width按线路路径和宽度划分的走廊路径
【发布时间】:2018-05-16 09:30:16
【问题描述】:

我需要写一个函数,通过线路径和宽度生成走廊路径。

例如,我有一组折线坐标:

var coords = [
  50, 50,
  150, 50,
  250, 100,
  220, 200,
  350, 100,
];

https://i.stack.imgur.com/FCCxb.png

然后我使用函数来获取走廊路径:

var width = 10;
var corridorPath = getCorridorPath(coords, width);

函数应该返回类似的东西:

[
  40, 50,
  50, 40,
  150, 40,
  157, 41,
  255, 90,
  260, 105,
  240, 170,
  340, 90,
  360, 90,
  360, 110,
  220, 215,
  205, 205,
  233, 107,
  147, 62,
  50, 60,
  40, 50,
]

https://i.stack.imgur.com/v3wxN.png

【问题讨论】:

  • 到目前为止你尝试过什么?两个外边缘的坐标也似乎模棱两可

标签: javascript math canvas geometry


【解决方案1】:

计算平行折线和连线。

对于两个相邻边 ABBC 找到归一化向量 abcb

计算单位平分线向量:

 b = (ab + cb).normalized

计算平分线的长度为

 len = d / sin(fi)

其中 d 是偏移量(半角),fi 是向量 b 和 ab 之间的角度:

 fi = atan2(crossproduct(b,ab), dotproduct(b,ab))

找到偏移点(左右)为

B' = B + l * b
B'' = B - l * b

请注意,您要切割长三角形,因此偏移点对锐角边有效,并且您需要重新计算切割帽的两个点 - 例如,获取中心点B''' = B - d * b并添加向量,垂直于平分线.

【讨论】:

  • BB'B''代表什么?
  • @SGhaleb B 是源折线的交汇点。 B' 和 B'' 是新的左右多段线上的点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
相关资源
最近更新 更多