Skip to Content.
Sympa Menu

cgal-discuss - Re: [cgal-discuss] Boolean operations between unclosed polyhedrons?

Subject: CGAL users discussion list

List archive

Re: [cgal-discuss] Boolean operations between unclosed polyhedrons?


Chronological Thread 
  • From: Andreas Fabri <>
  • To:
  • Subject: Re: [cgal-discuss] Boolean operations between unclosed polyhedrons?
  • Date: Wed, 16 Apr 2014 07:04:08 +0200
  • Organization: GeometryFactory




Would you please discuss non-CGAL related topics on the appropriate
mailing list.

Best regards,

Andreas

On 16/04/2014 05:01, tang wrote:

Hi Zohar,

Could you please help me to take a look at the following code in Carve to
read OFF file? The code crashed at this line:
carve::mesh::MeshSet<3> poly1(faces);

In addition, could you please tell me how to write the code to write OFF
file (the function 'write_off')?


Thanks,
Tang Laoya



/// file: test_carve_polyhedrons_2.cpp
// Begin License:
// Copyright (C) 2006-2011 Tobias Sargeant
().
// All rights reserved.
//
// This file is part of the Carve CSG Library (http://carve-csg.com/)
//
// This file may be used under the terms of the GNU General Public
// License version 2.0 as published by the Free Software Foundation
// and appearing in the file LICENSE.GPL2 included in the packaging of
// this file.
//
// This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
// INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE.
// End:

#include <carve/csg.hpp>
#include <carve/poly.hpp>
#include <carve/geom.hpp>

#include <vector>
#include <iostream>

void read_off(std::vector<carve::mesh::MeshSet&lt;3>::vertex_t> *verts,
std::vector<carve::mesh::MeshSet&lt;3>::face_t *> *faces,char* file)
{
FILE *fp=fopen(file,"r");
char off[10];
int np, nf, nv, v;
double x,y,z;
std::vector<carve::mesh::MeshSet&lt;3>::vertex_t *> corners;
fscanf(fp,"%s\n",&off);
fscanf(fp,"%d %d\n",&np,&nf);
for (int i=0;i<np;i++)
{
fscanf(fp,&quot;%e %e %e\n&quot;,&amp;x,&amp;y,&amp;z);

verts->push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(x,y,z)));
}
for (int i=0;i<nf;i++)
{
fscanf(fp,&quot;%d&quot;,&amp;nv);
for (int j=0;j&lt;nv;j++)
{
fscanf(fp,&quot;%d&quot;,&amp;v);
corners.push_back(&amp;(*verts)[v]);
}
faces->push_back(new
carve::mesh::MeshSet<3>::face_t(corners.begin(),
corners.end()));
corners.clear();
}
fclose(fp);
}

void write_off(carve::mesh::MeshSet<3> poly,char *file)
{

}

int main()
{
//create a tetrahedron
#define mytest
#ifdef mytest
std::vector<carve::mesh::MeshSet&lt;3>::vertex_t> verts;
std::vector<carve::mesh::MeshSet&lt;3>::face_t *> faces;
char
*file="E:\\Users\\tang\\tang\\mesh\\CSG\\carve-clone\\mytest\\a1.off";
read_off(&verts,&faces,file);
carve::mesh::MeshSet<3> poly1(faces);
file="E:\\Users\\tang\\tang\\mesh\\CSG\\carve-clone\\mytest\\a2.off";
read_off(&verts,&faces,file);
carve::mesh::MeshSet<3> poly2(faces);
carve::mesh::MeshSet<3> *is_poly = carve::csg::CSG().compute(&poly1,
&poly2,

carve::csg::CSG::A_MINUS_B);
#else
std::vector<carve::mesh::MeshSet&lt;3>::vertex_t> tet_verts;
std::vector<carve::mesh::MeshSet&lt;3>::face_t *> tet_faces;
std::vector<carve::mesh::MeshSet&lt;3>::vertex_t *> corners;


tet_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(0.0,
0.0, 0.0)));

tet_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(1.0,
0.0, 0.0)));

tet_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(0.0,
1.0, 0.0)));

tet_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(0.0,
0.0, 1.0)));

corners.push_back(&tet_verts[0]);
corners.push_back(&tet_verts[2]);
corners.push_back(&tet_verts[1]);
tet_faces.push_back(new carve::mesh::MeshSet<3>::face_t(corners.begin(),
corners.end()));

corners.clear();
corners.push_back(&tet_verts[0]);
corners.push_back(&tet_verts[1]);
corners.push_back(&tet_verts[3]);
tet_faces.push_back(new carve::mesh::MeshSet<3>::face_t(corners.begin(),
corners.end()));

corners.clear();
corners.push_back(&tet_verts[0]);
corners.push_back(&tet_verts[3]);
corners.push_back(&tet_verts[2]);
tet_faces.push_back(new carve::mesh::MeshSet<3>::face_t(corners.begin(),
corners.end()));

corners.clear();
corners.push_back(&tet_verts[1]);
corners.push_back(&tet_verts[2]);
corners.push_back(&tet_verts[3]);
tet_faces.push_back(new carve::mesh::MeshSet<3>::face_t(corners.begin(),
corners.end()));

carve::mesh::MeshSet<3> tetrahedron(tet_faces);

//create a triangle
std::vector<carve::mesh::MeshSet&lt;3>::vertex_t> tri_verts;
std::vector<carve::mesh::MeshSet&lt;3>::face_t *> tri_faces;

//Vertices
//crashes if last coordinate set to 1e-8, but ok for 1e-7

//tri_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(-0.3,
0.0, 1e-8)));

//tri_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(1.0,
0.0, 1.1e-8)));

//tri_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(-0.3,
1.0, 1.1e-8)));

tri_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(-0.1,
-0.1, 0.5)));

tri_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(1.1,
-0.1, 0.5)));

tri_verts.push_back(carve::mesh::MeshSet<3>::vertex_t(carve::geom::VECTOR(-0.1,
1.1, 0.5)));

//Face
corners.clear();
corners.push_back(&tri_verts[0]);
corners.push_back(&tri_verts[2]);
corners.push_back(&tri_verts[1]);
tri_faces.push_back(new carve::mesh::MeshSet<3>::face_t(corners.begin(),
corners.end()));

// corners.clear();
// corners.push_back(&tri_verts[0]);
// corners.push_back(&tri_verts[1]);
// corners.push_back(&tri_verts[2]);
// tri_faces.push_back(new carve::mesh::MeshSet<3>::face_t(corners));

carve::mesh::MeshSet<3> triangle(tri_faces);

//cut triangle with tetrahedron.
carve::mesh::MeshSet<3> *is_poly = carve::csg::CSG().compute(&tetrahedron,
&triangle,

carve::csg::CSG::B_MINUS_A);
#endif
// std::cout << "Tetrahedron is ... \n" << tetrahedron;
// std::cout << "Triangle is ... \n" << triangle;
// std::cout << "Intersection is ... \n" << *is_poly;

return 0;
}



--
View this message in context:
http://cgal-discuss.949826.n4.nabble.com/Boolean-operations-between-unclosed-polyhedrons-tp4659114p4659139.html
Sent from the cgal-discuss mailing list archive at Nabble.com.


--
Andreas Fabri, PhD
Chief Officer, GeometryFactory
Editor, The CGAL Project

phone: +33.492.954.912 skype: andreas.fabri

--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://sympa.inria.fr/sympa/info/cgal-discuss





Archive powered by MHonArc 2.6.18.

Top of Page