ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2D manhattan diagram

2021-10-15 15:31:59  阅读:175  来源: 互联网

标签:diagram distance int pos poly 2D vts mindist manhattan


float mindist = 999999.9;
int index = -1;
for(int i = 0; i< npoints(1); i++)
{
    vector pos = point(1, 'P', i);
    
    //float distance = sqrt(pow(pos.x - @P.x, 2)+pow(pos.z - @P.z,2));
    float distance = abs(pos.x - @P.x)+abs( pos.z - @P.z);
    
    if(mindist > distance)
    {
        mindist = distance;
        index = i;
    }
}

i@val = index;
f@dist = mindist;
dint vals[] = array();
int offset = -1;
int vts[] = primvertices(0, @primnum);
//i[]@vts = vts;
int vt0 = vts[0];
int pt0 = vertexpoint(0, vt0);
int val0 = point(0, 'val', pt0);

for(int i = 0; i<len(vts); i++)
{
    int vt = vts[i];
    int pt = vertexpoint(0, vt);
    int val = point(0, 'val', pt);
    
    int vt1 = vts[(i+1) % len(vts)];
    int pt1 = vertexpoint(0, vt1);
    int val1 = point(0, 'val', pt1);
    
    if(offset == -1 && val != val1)
    {
        offset = i; // get times when suffer different area value.
    }
    
    append(vals, val);
}


vals = sort(vals); int nvals[] = array(vals[0]); // fill first element value. for(int i = 0; i<len(vals)-1; i++) { int val1 = vals[i]; int val2 = vals[i+1]; if(val1 != val2) { append(nvals, val2); } } i[]@nvals = nvals; int poly = -1; // this condition defines the sequance of connecting line. int count; // polygon count if(len(nvals) == 1) { setprimattrib(0, 'val', @primnum, nvals[0]); } else { removeprim(0, @primnum, 1); for(int i = offset; i<=len(vts) + offset; i++) { int vt1 = vts[i % len(vts)]; int vt2 = vts[(i+1) % len(vts)]; int pt1 = vertexpoint(0, vt1); int pt2 = vertexpoint(0, vt2); vector pos1 = point(0, 'P', pt1); vector pos2 = point(0, 'P', pt2); int val1 = point(0, 'val', pt1); int val2 = point(0, 'val', pt2); if(val1 != val2) { int m_pt = addpoint(0, (pos1 + pos2)/2); if(poly < 0) { poly = addprim(0, 'poly'); addvertex(0, poly, m_pt); setprimattrib(0, 'val', poly, val2); count = 1; } else { addvertex(0, poly, m_pt); count++; if(len(nvals) >= 3 && count == 3) { setprimgroup(0, 'triangle', poly, 1); } poly = addprim(0, 'poly'); setprimattrib(0, 'val', poly, val2); addvertex(0, poly, m_pt); count = 1; } } if(poly >= 0) { count++; addvertex(0, poly, pt2); } } }

接下来,需要单独处理破洞的地方。先拾取生成好的模型面,翻转180度,用于填充 holes。

vector cen_pos = getbbox_center(0, itoa(@primnum));
int pts[] = primpoints(0, @primnum);

for(int i = 0; i<len(pts); i++)
{    
    vector pos = point(0, 'P', pts[i]);
    matrix mat = ident();
    rotate(mat, $PI, {0,1,0});
    
    pos -= cen_pos;
    pos *= mat;
    pos += cen_pos;
    
    setpointattrib(0, 'P', pts[i], pos ); 
}
setprimattrib(0, 'val', @primnum, i@val);

 

标签:diagram,distance,int,pos,poly,2D,vts,mindist,manhattan
来源: https://www.cnblogs.com/TadGuo/p/15411220.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有