2

OpenLayers での表示用に生成されたマップ レイヤー内のポイント間に WKT LineString を動的に生成しています。ポイント間の線を曲線にしたいのですが、さまざまな入力変数に基づいて曲率を動的に変更できるようにしたいと考えています。

これはネットワーク監視アプリ用であり、ポイント間の遅延時間に基づいて曲率を設定したいと考えています (生の遅延自体ではなく、特定の期間中の「通常の」値からの偏差)。

一部の GIS アプリとデータベースCircularStringは WKT の拡張機能をサポートしていますが、OpenLayers はそれについて何も知りません。

したがって、線分から曲線を生成する必要があります。

現在、行の文字列は次のようになっています。

LINESTRING(hop1_long hop1_lat, hop2_long hop2_lat)

線分を「湾曲」させる唯一の方法は、中間点を挿入することです。

LINESTRING(hop1_long hop1_lat, long1 lat1, long2 lat2, ..., hop2_long hop2_lat)

これは私たちのアプリケーションには完全に適しているはずですが、中間点を生成する方法がわかりません!

2次元平面の線分から「曲がった」線を生成するためのよく知られた方法/アルゴリズムがあると思います。これを達成する方法、または役立つ可能性のある本/記事/オンラインリソースに関するアイデアはありますか?

更新 (2010-08-13):

ベジエ曲線がチケットであり、基本的なベジエ アルゴリズムの実装は、それを読んだ後は非常に簡単でした。しかし、制御点を生成するためにいくつかのコードを書かなければなりませんでした。これが私が思いついたPHPコードです。xこれは、メンバーを持つ「Vector2d」クラスを想定していyます。

function get_control_points($to, $from, $mag_scale, $angle) {
  $dirX = $to->x - $from->x;
  $dirY = $to->y - $from->y;

  $mag = sqrt(($dirX * $dirX) + ($dirY * $dirY));
  if (!$mag) {
    配列を返します($to, $from);
  }

  $length = $mag * $mag_scale;

  $dirX = $dirX / $mag;
  $dirY = $dirY / $mag;

  $sin = sin($角度);
  $cos = cos($角度);

  $rotX = $cos * $dirX - $sin * $dirY;
  $rotY = $sin * $dirX + $cos * $dirY;
  $rotNegX = $cos * -$dirX - $sin * $dirY;
  $rotNegY = $sin * $dirX - $cos * $dirY;

  // 「後方」カーブの制御点を反転
  もし ($dirX x;
    $y1 = -$rotNegY * $length + $from->y;
    $x2 = -$rotX * $length + $to->x;
    $y2 = -$rotY * $length + $to->y;
  }
  // または、「通常の」コントロール ポイントを生成します
  そうしないと {
    $x1 = $rotX * $length + $from->x;
    $y1 = $rotY * $length + $from->y;
    $x2 = $rotNegX * $length + $to->x;
    $y2 = $rotNegY * $length + $to->y;
  }

  return array(new Vector2d($x2, $y2), new Vector2d($x1, $y1));
}
4

1 に答える 1

3

曲線を作る一連の線分を生成したい場合は、単一の変数によって簡単にパラメータ化できる曲線を調べることから始めます。たとえば、中心が (cx,cy) で半径が r の円は、次の式でパラメーター化されます。

(x,y) = (cx,cy)+r*(cos(t), sin(t)),

ここで、t は 0 から 2π までです。

したがって、たとえば、値 t k =π×k/30 (k は 0 から 30 まで) で円を評価することによって、半円形状を作成できます。これにより、30 の線分で構成される半円弧が得られます。 .

より一般的な曲線が必要な場合は、ベジエ曲線を調べてください。それらは、0 から 1 の間の等間隔で評価できる値 t によってパラメーター化されます。

于 2010-08-09T21:35:11.720 に答える