
ポリラインそれぞれの始点・終点の近いもの同士の組み合わせを考える。
polyline0の終点[-1]とpolyline1の始点[0]がつながる場合
[0]—–[-1][0]—–[-1]
そのままポイントをつなげる
polyline0の終点[-1]とpolyline1の終点[-1]がつながる場合
[0]—–[-1][-1]—–[0]
polyline1を逆順にしてつなげる
polyline0の始点[0]とpolyline1の始点[0]がつながる場合
[-1]—–[0][0]—–[-1]
polyline0を逆順にしてつなげる
polyline0の始点[0]とpolyline1の終点[-1]がつながる場合
[-1]—–[0][-1]—–[0]
polyline0とpolyline1を逆順にしてつなげる
VEX
Wrangle SOPのinput1にマージしたポリライン2本をつなぐ。
// connect close ends
// input0: ポリライン2本をマージしたもの
// Run Over: Detail
// つなげる距離の閾値
float minDist = 10;
int npts0[] = primpoints(0, 0);
int npts1[] = primpoints(0, 1);
vector start0 = point(0, "P", npts0[0]);
vector end0 = point(0, "P", npts0[-1]);
vector start1 = point(0, "P", npts1[0]);
vector end1 = point(0, "P", npts1[-1]);
// 4通りの始点終点の組み合わせから距離の短いものを選ぶ
float dist[];
dist[0] = length(end0 - start1);
dist[1] = length(end0 - end1);
dist[2] = length(start0 - start1);
dist[3] = length(start0 - end1);
int index = -1;
for(int i = 0; i < len(dist); i++)
{
if(dist[i] < minDist)
{
minDist = dist[i];
index = i;
}
}
// ポリラインを新しく作り直す
if(index != -1)
{
int prim = addprim(0, "polyline");
if(index == 1)
npts1 = reverse(npts1);
else if(index == 2)
npts0 = reverse(npts0);
else if(index == 3)
{
npts0 = reverse(npts0);
npts1 = reverse(npts1);
}
// polyline0をポイントをつなげていく
for(int i = 0; i < len(npts0); i++)
addvertex(0, prim, npts0[i]);
// polyline1のポイントをつなげていく
for(int i = 0; i < len(npts1); i++)
addvertex(0, prim, npts1[i]);
for(int i = 0; i < nprimitives(0); i++)
removeprim(0, i, 0);
}
Python
Python SOPのinput1にマージしたポリライン2本をつなぐ。
node = hou.pwd()
geo = node.geometry()
inputs = node.inputs()
geo1 = inputs[1].geometry()
# ひとつめのポリラインの座標リスト
listPos0 = []
listPoints0 = geo1.prim(0).points()
for i in range(len(listPoints0)):
listPos0.append(listPoints0[i].position())
# ふたつめのポリラインの座標リスト
listPos1 = []
listPoints1 = geo1.prim(1).points()
for i in range(len(listPoints1)):
listPos1.append(listPoints1[i].position())
# 4通りの始点終点の組み合わせから距離の短いものを選ぶ
dist = []
dist.append((listPos0[-1] - listPos1[0]).length())
dist.append((listPos0[-1] - listPos1[-1]).length())
dist.append((listPos0[0] - listPos1[0]).length())
dist.append((listPos0[0] - listPos1[-1]).length())
# 一番近い組み合わせを探す
index = 0
minDist = dist[index]
for i in range(len(dist)):
if(dist[i] < minDist):
minDist = dist[i]
index = i
# 組み合わせで座標の順番を逆転させる
if index != -1:
if index == 1:
listPos1.reverse()
elif index == 2:
listPos0.reverse()
elif index == 3:
listPos0.reverse()
listPos1.reverse()
newPosList = listPos0 + listPos1
# ポイントを作成し、リストに保存
points = []
for pos in newPosList:
pt = geo.createPoint()
pt.setPosition(pos)
points.append(pt)
# ポリライン(オープンカーブ)を作成
polyline = geo.createPolygon()
polyline.setIsClosed(False)
# ポイントをポリラインに追加
for pt in points:
polyline.addVertex(pt)