计算点是在破折号上还是在间隙上的公式

Formula to calculate if a point is on a dash or a gap

我正在寻找一个公式来检查任何长度的虚线上的点是否落在破折号或间隙上。

我的做法是使用下面的公式

/**
 * @param t The point to check
 * @param dash The length of a dash
 * @param gap The length of a gap
 */
function isOnDash(t, dash, gap) {
  const verticalOffset = 1 - gap / (dash + gap);
  const period = (2 * Math.PI) / (dash + gap);
  const phase = Math.asin(-verticalOffset) / period;

  return Math.sin(period * (t + phase)) + verticalOffset >= 0;
}

这几乎可以工作,但不是 100% 准确。这是一个 JSFiddle 显示此方法与在 HTML canvas 元素上绘制虚线的比较。

这是一道算术题,不是连续数题。尽可能避免使用 floating-points 和 Math.sin 或 floating-point 除法之类的函数,这将不可避免地导致近似误差。

相反,modulo 是您问题的简单算术答案。

/**
 * @param t The point to check
 * @param dash The length of a dash
 * @param gap The length of a gap
 */
function isOnDash(t, dash, gap) {
  return (t % (dash + gap)) < dash;
}