opengles吧 关注:83贴子:119
  • 1回复贴,共1

多边形 三角化 非常好用 Delaunay Triangulator

只看楼主收藏回复


下面时候演示了如何使用这个源代码,源码文件盒我们的工厂放到同一个目录下一起编译就可以了。是标准的C。
源代码可以去这里下载:
bbs.alicexy.com/forum.php?mod=attachment&aid=MjQzfGYxZGI0NWU2fDE0MDU0ODEwNzd8MHw3Mjc%3D
/*Copyright 1993, 1995, 1997, 1998, 2002, 2005 */
/* Jonathan Richard Shewchuk */
/* 2360 Woolsey #H */
/* Berkeley, California 94705-1927 */
/* jrs@cs.berkeley.edu
struct triangulateio in,out;
int i,polygon_size;
polygon_size = polygonList->size();
if(polygon_size >2)//yangqiankun important 有可能少于3个点,某个模型一层全黑。这是原始程序bug导致,这里先判断一下。
{
in.numberofpoints = polygon_size;
in.numberofpointattributes = 1;
in.pointlist = new REAL[in.numberofpoints * 2 * sizeof(REAL)];
for(i = 0; i < polygon_size; i++)
{
in.pointlist[2*i+0]= REAL(polygonList->at(i).x());
in.pointlist[2*i+1]= REAL(polygonList->at(i).y());
}
in.pointattributelist = new REAL[in.numberofpoints *
in.numberofpointattributes *
sizeof(REAL)];
for(i=0;i<in.numberofpoints;i++)
{
in.pointattributelist = 0.0;
}
in.pointmarkerlist = new int[in.numberofpoints * sizeof(int)];
for(i=0;i<in.numberofpoints;i++)
{
in.pointmarkerlist = 0;
}
in.numberofsegments = in.numberofpoints;
in.segmentlist = new int[in.numberofsegments* sizeof(int)*2];
in.segmentmarkerlist = new int[in.numberofsegments* sizeof(int)];
for(i=0;i<(in.numberofsegments-1);i++)
{
in.segmentlist[2*i]=i;
in.segmentlist[2*i+1]=i+1;
in.segmentmarkerlist= 0;
}
in.segmentlist[2*i]=i;
in.segmentlist[2*i+1]=0;
in.segmentmarkerlist= 0;
in.numberofholes = 0;
in.numberofregions = 0;
out.pointlist = (REAL *) NULL; /* Not needed if -N switch used. */
/* Not needed if -N switch used or number of point attributes is zero: */
out.pointattributelist = (REAL *) NULL;
out.pointmarkerlist = (int *) NULL; /* Not needed if -N or -B switch used. */
out.trianglelist = (int *) NULL; /* Not needed if -E switch used. */
/* Not needed if -E switch used or number of triangle attributes is zero: */
out.triangleattributelist = (REAL *) NULL;
out.neighborlist = (int *) NULL; /* Needed only if -n switch used. */
/* Needed only if segments are output (-p or -c) and -P not used: */
out.segmentlist = (int *) NULL;
/* Needed only if segments are output (-p or -c) and -P and -B not used: */
out.segmentmarkerlist = (int *) NULL;
out.edgelist = (int *) NULL; /* Needed only if -e switch used. */
out.edgemarkerlist = (int *) NULL; /* Needed if -e used and -B not used. */
out.trianglearealist = (REAL *) NULL;
/* Triangulate the points. Switches are chosen to read and write a */
/* PSLG (p), preserve the convex hull (c), number everything from */
/* zero (z), assign a regional attribute to each element (A), and */
/* produce an edge list (e), a Voronoi diagram (v), and a triangle */
/* neighbor list (n). */
triangulate("pzFQ", &in, &out,NULL );
QVector2D vert;
int numberofvertex,coor_index;
numberofvertex = out.numberoftriangles*3;
for (i = 0; i < numberofvertex; i++)
{
coor_index = out.trianglelist;
vert.setX(out.pointlist[coor_index*2]);
vert.setY(out.pointlist[coor_index*2+1]);
triangleStrip->push_back(vert);
}
delete (in.pointlist);
delete (in.pointattributelist);
delete (in.pointmarkerlist);
delete (in.segmentlist);
delete (in.segmentmarkerlist);
delete (out.pointlist);
delete (out.pointattributelist);
delete (out.pointmarkerlist);
delete (out.trianglelist);
delete (out.triangleattributelist);
delete (out.trianglearealist);
delete (out.neighborlist);
delete (out.segmentlist);
delete (out.segmentmarkerlist);
delete (out.edgelist);
delete (out.edgemarkerlist);
}
return true;


IP属地:广东1楼2014-07-17 10:30回复
    请问有没有认识的在武汉的会opengles软件开发的大牛,求推荐


    2楼2016-06-03 16:09
    回复