ポリラインを任意の長さで分割する

//
// 線分を分割するためのフラグを立てる
// RunOver:Primitives
//
float threshold = 100;  // 区切る長さ(m)

float curveLength = primintrinsic(0, "measuredperimeter", @primnum);

if(curveLength > threshold)
{
    float cutLength = threshold;
    
    // 等間隔に分割する場合はコメントアウトする
    int num = int(rint(curveLength / threshold));
    cutLength = curveLength / (num + 1);
    
    int prim = addprim(0, "polyline");
    
    float length = 0;
    int pts[] = primpoints(0, @primnum);
    for(int i = 0; i < len(pts)-1; i++)
    {
        addvertex(0, prim, pts[i]);
    
        vector p0 = point(0, "P", pts[i]);
        vector p1 = point(0, "P", pts[i+1]);
        
        length += length(p1 - p0);
        
        if(length > cutLength)
        {
            // 次のポリラインを生成する
            prim = addprim(0, "polyline");
            addvertex(0, prim, pts[i]);
            
            length = 0;
        }
    }
    addvertex(0, prim, pts[-1]);
    
    removeprim(0, @primnum, 1);
}

フラグを立てて分割する場合

はじめにポリラインの分割するポイントにフラグを立てる。

//
// 線分を分割するためのフラグを立てる
// RunOver:Primitives
//
float threshold = 1000;  // 区切る長さ(m)

float curveLength = primintrinsic(0, "measuredperimeter", @primnum);

if(curveLength > threshold)
{
    float cutDist = threshold;
    
    // 等間隔に分割する場合はコメントアウトする
    //int num = int(rint(curveLength / threshold));
    //cutDist = curveLength / (num + 1);
    
    int count = 0;
    float pos = 0;
    int pts[] = primpoints(0, @primnum);
    for(int i = 0; i < len(pts)-1; i++)
    {
        vector p0 = point(0, "P", pts[i]);
        vector p1 = point(0, "P", pts[i+1]);
        float length = length(p1 - p0);
        
        pos += length;
        
        if(pos > cutDist)
        {
            pos = 0;
            setpointattrib(0, "__cut", pts[i], 1);
        }
    }
}

つぎに、フラグを立てたポイントを通るたびに新しいポリラインを生成していく。

//
// ポリラインを分割していく
// RunOver: Primitives
//
int pts[] = primpoints(0, @primnum);

int prim = addprim(0, "polyline");
addvertex(0, prim, pts[0]);

for(int i = 1; i < len(pts)-1; i++)
{
    addvertex(0, prim, pts[i]);
    
    int flag = point(0, "__cut", pts[i]);
    if(flag == 1)
    {
        // 次のポリラインを生成する
        prim = addprim(0, "polyline");
        addvertex(0, prim, pts[i]);
    }
}
addvertex(0, prim, pts[len(pts)-1]);

removeprim(0, @primnum, 1);

アトリビュートを引き継ぎたい場合は以下のページを参考に

プリミティブのアトリビュートとグループを転写する

タイトルとURLをコピーしました