ポリライン同士を近い端点でつなげる

ポリラインそれぞれの始点・終点の近いもの同士の組み合わせを考える。

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)
タイトルとURLをコピーしました