ライン沿い等間隔ポイントから横方向ラインを綺麗に作成する方法

40 views
Skip to first unread message

TJ

unread,
Jul 20, 2018, 7:20:27 AM7/20/18
to fm...@googlegroups.com
FME 2018.1.0.0

下図のようにライン沿い等間隔赤色ポイントがあります。以下のような横方向の緑色ラインを作成したいです。
1.緑色ラインはなるべく赤色ポイント所在中心ラインと垂直に近い方向にしたい
2.緑色ライン同士は交差しない
3.緑色ラインは必ず赤色ポイントを通す
4.緑色ラインは一定長さである


試したことは以下となります。
方法1
OffsetCurveGenerator で片方のオフセットライン生成し、オフセットラインをメジャーを使ってポイントの数分均等割り箇所のポイントを作成する、元の赤いポイントと繋ぐラインを作成する。ラインをもう片方方向へ延長する。
この方法で作成したラインはライン同士交差しないが、場所によって中心ラインとの角度は垂直角度とかなり乖離してしまいます。オフセットラインをメジャーで長さを基準に均等しているため、湾曲部の長さ変化を考慮できていないのが原因だと思います。

方法2
OffsetCurveGenerator で片方のオフセットライン生成し、NeighborFinder で赤色ポイントと一番近いポイントを見つけし、見つけたポイントと赤色ポイントを繋ぐラインを作成します。この方法だと場合によって、前後の赤色ポイントからの一番近いポイントは逆転になったりするため、作成したライン同士が交差してしまいます。

方法3
方法2の NeighborFinder で作成したポイントに対し、オフセットラインのメジャーを使ってソート後、赤色ポイントと繋ぐラインを作成する。この方法は片側のラインの交差が解消したものの、逆方向へ延長した時、中心線の湾曲方向によって、逆方向側でライン同士の交差が発生してしまう場合があります。

上記の諸問題を回避できる何かいい案があれば教えていただきたいです。

Takashi Iijima

unread,
Jul 20, 2018, 7:51:42 AM7/20/18
to FMEユーザーフォーラム
> 2.緑色ライン同士は交差しない

この条件がちょっとやっかいですね。
カーブ上の等間隔のポイントを通り、カーブに正確に垂直で一定の長さのラインを考えた時、(カーブの半径) < (片側のラインの長さ) であるところでは、必ずラインは交差します。
前提条件として、カーブ半径 < 片側のライン長 となるような急カーブはない、と考えて良いのでしょうか?
あるいは、そのような急カーブがあった場合には、どのように調整すべきでしょうか?例えば、垂直でなくても良いので、長さは必ず一定にしなくてはならない。など。

TJ

unread,
Jul 20, 2018, 8:28:48 AM7/20/18
to fm...@googlegroups.com
交差しない条件をクリアするのは確かに思ったより難しかったです。

垂直は必須条件ではなく、交差する場合ラインの角度を調整しても大丈夫です。長さは必ず一定であります。
自動発生後、手動で修正することも考えていますが、修正箇所が多くて、なるべく自動で交差しないラインを生成したいです。

確かに、急カーブの場合、ライン交差する確率が高いですが、今回(カーブの半径) > (片側のラインの長さ)のような緩やかなカーブのみと考えてよいです。

Takashi Iijima

unread,
Jul 20, 2018, 8:52:13 AM7/20/18
to FMEユーザーフォーラム
(カーブの半径) < (片側のラインの長さ) となるような急カーブがないという前提であれば、次のような方法が考えられます。緑のラインの長さ = L とおき、
・ポイント (x, y) について、その一つ前のポイントから一つ後のポイントに向かう方向の単位ベクトル (ux, uy) を求める。
・ポイント (x, y) を通り、ベクトルの左、右法線方向に L/2 ずつ離れた点 (x - uy * L/2,  y + ux * L/2) と (x + uy * L/2, y - ux * L/2) を結ぶ。

最初と最後のポイントについては別途考える必要がありますが、比較的きれいな緑ラインができます。


Takashi Iijima

unread,
Jul 20, 2018, 8:56:38 AM7/20/18
to FMEユーザーフォーラム
Knowledge Center で "perpendicular line" をキーワードとして検索すると、参考になる記事が見つかるかもしれません。

TJ

unread,
Jul 20, 2018, 9:09:16 AM7/20/18
to FMEユーザーフォーラム
前後頂点結ぶラインの垂線ですね、これはいいかもしれません。作ってみます。
最初と最後のポイントについて OffsetCurveGenerator で生成したラインの端点と連結すれば作れると思います。

TJ

unread,
Jul 22, 2018, 9:14:33 PM7/22/18
to FMEユーザーフォーラム
教えていただいた方法で綺麗な横方向ラインを生成できました。単位ベクトルを使った垂線の生成方法を教えていただいてありがとうございました。単ベクトルの知識忘れていましたので、復習をしていました。この方法は他の方法に比べて、圧倒的に簡単でした。
(カーブの半径) < (片側のラインの長さ)と伝えていましたが、実際の結果を見ますと交差のラインが少しありました。交差の数は当初試した方法よりだいぶ減りましたので、この部分について、手動で修正する、修正できない場合割り切って妥協するしかないと考えています。


Takashi Iijima

unread,
Jul 22, 2018, 9:58:34 PM7/22/18
to fm...@googlegroups.com
ベクトル演算によって簡単に解決できる問題は結構あります。
FME Hub で公開している 2DVectorCalculator は、わりと人気があるトランスフォーマーのひとつです。

> 実際の結果を見ますと交差のラインが少しありました。

各点は「おおむね」緩やかなカーブ上にあるように見えますが、実際にはわずかに左右にずれていると、そこで局所的に (カーブの半径) < (片側のラインの長さ) となり、結果として緑のラインが交差する、ということはあると思います。
思いつきですが、ベクトルを求める際に、直前、直後の1点ずつだけでなく、2~3点ずつを使って平均化すると、改善できるかも知れません。

TJ

unread,
Jul 23, 2018, 12:44:19 AM7/23/18
to FMEユーザーフォーラム
>FME Hub で公開している 2DVectorCalculator は、わりと人気があるトランスフォーマーのひとつです。
2DVectorCalculator は使ったことがありますが、中身までチェックしていませんでした。これもベクトルを利用しているわけですね。時間があるとき、中身を見てみます。


>思いつきですが、ベクトルを求める際に、直前、直後の1点ずつだけでなく、2~3点ずつを使って平均化すると、改善できるかも知れません。
2~3点ずつを使って平均化するというのは平均の角度を取るということでしょうか。交差する箇所のポイントをチェックしてたら、ほぼ折れ線(前後の数ポイントが直線上にある)で書いてある箇所がほとんどでした。これだと前後の2~3点ずつの平均取っても、結果あまり変わらないかもしれません。

Takashi Iijima

unread,
Jul 23, 2018, 3:04:33 AM7/23/18
to FMEユーザーフォーラム
画像を見ると、ポイント間隔が小さく、密に配置されているので、カーブからのわずかなズレによっても局所的なカーブ半径に大きく影響するのかな、と思いました。
前後2~3区間のベクトルの和 (vx の計, vy の計) を求め、その単位ベクトル(vx, vy をそれぞれベクトルの大きさ(長さ)で割る)を求めることで平均化できます。
うまくいくかどうかは、データの状態に依存するので、なんとも言えませんが。
Reply all
Reply to author
Forward
0 new messages