math.stackexchange hereで解決策を見つけました。この解決策は線のみですが、特定の変更を加えた曲線とポリラインに適用できます。まず、2 つのイニシャル ポイントを通る直線の式を決定する必要があります。
ステップ1
ポイント: P1(x1, y1) および P2(x2, y2)
ポイントとその隣接ポイント間の距離: d
一般形: Ax + By + C = 0
ここで: A = y2 - y1; B = x1 - x2; C = x2y1 - x1y2。
その後、この式を短い形式で定義する必要があります。
ステップ2
省略形: y = mx +n
ここで: m = - A / B; n = - C / B. (B != 0 の場合)
A == 0 の場合、次の式が得られます: y = C (水平線がある場合)
B == 0 の場合、次の式が得られます: x = C (垂直線がある場合)
線の傾きがある場合、それに垂直な線の傾きが必要です。
ステップ 3
垂線勾配: m2 = - 1 / m
A == 0 または B == 0 の場合は、手順 4 に進みます。
次に、両方の初期点の隣接点を取得する必要があります。
ステップ 4
最初のポイントは P1N1、P1N2、2 番目のポイントは P2N1 と P2N2 として隣接ポイントに注意します。
特殊なケース (水平線と垂直線、A == 0 または B == 0 の場合) では、次のようになります。
A == 0 (水平線) の場合:
P1N1(x1, y1 - d / 2); P1N2(x1, y1 + d / 2); P2N1(x2, y2 + d / 2); P2N2(x2, y2 - d / 2)。
B == 0 (垂直線) の場合:
P1N1(x1 - d / 2, y1); P1N2(x1 + d / 2, y1); P2N1(x2 + d / 2, y2); P2N2(x2 - d / 2, y2)。
その他の場合 (A != 0 および B != 0):
P1N1:
x = (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x1;
y = (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y1;
P1N2:
x = - (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x1;
y = - (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y1;
P2N1:
x = (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x2;
y = (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y2;
P2N2:
x = - (d / 2) / Math.sqrt(1 + Math.pow(m2, 2)) + x2;
y = - (m2 * (d / 2)) / Math.sqrt(1 + Math.pow(m2, 2)) + y2;
これらの数式をアプリケーションに実装する場合は、パフォーマンスを向上させるために結果をキャッシュする必要があります。