Revision: 54036
http://brlcad.svn.sourceforge.net/brlcad/?rev=54036&view=rev
Author: starseeker
Date: 2012-12-11 02:20:53 +0000 (Tue, 11 Dec 2012)
Log Message:
-----------
Something not quite right - probably need to revisit bookkeeping scheme - but
take a step towards boundary handling.
Modified Paths:
--------------
brlcad/trunk/src/librt/test_subdivision.cpp
Modified: brlcad/trunk/src/librt/test_subdivision.cpp
===================================================================
--- brlcad/trunk/src/librt/test_subdivision.cpp 2012-12-10 21:50:12 UTC (rev
54035)
+++ brlcad/trunk/src/librt/test_subdivision.cpp 2012-12-11 02:20:53 UTC (rev
54036)
@@ -51,7 +51,7 @@
std::vector<size_t>::iterator l_it;
for(f_it = mesh->face_pts.begin(); f_it != mesh->face_pts.end(); f_it++) {
ON_3dPoint p1, p2, p3;
- l_it = (*f_it).second.begin();
+ l_it = (*f_it).second.begin();
p1 = *mesh->points_p0.At((*l_it));
p2 = *mesh->points_p0.At((*(l_it+1)));
p3 = *mesh->points_p0.At((*(l_it+2)));
@@ -67,40 +67,40 @@
// From Kobbelt sqrt(3)-Subdivision, eqns 7 and 8, solving for pinf
void point_inf(size_t p, struct Mesh_Info *mesh, ON_3dPointArray *p_a) {
- size_t n = mesh->point_valence[p];
- std::multimap<size_t, size_t>::iterator p_it;
- std::pair<std::multimap<size_t, size_t>::iterator, std::multimap<size_t,
size_t>::iterator> range;
- range = mesh->point_neighbors.equal_range(p);
- ON_3dPoint psum = ON_3dPoint(0,0,0);
- for(p_it = range.first; p_it != range.second; p_it++) {
- psum = psum + *mesh->points_p0.At((*p_it).second);
- }
- fastf_t alpha = alpha_n(n);
- //
- // 3 an 1
- // [pinf = ---------- * psum + -------- * p0]
- // 3 an n + n 3 an + 1
- //
- ON_3dPoint pinf = (3*alpha/((3*alpha+1)*n))*psum + 1/(3*alpha+1) *
*mesh->points_p0.At(p);
- p_a->Append(pinf);
+ size_t n = mesh->point_valence[p];
+ std::multimap<size_t, size_t>::iterator p_it;
+ std::pair<std::multimap<size_t, size_t>::iterator, std::multimap<size_t,
size_t>::iterator> range;
+ range = mesh->point_neighbors.equal_range(p);
+ ON_3dPoint psum = ON_3dPoint(0,0,0);
+ for(p_it = range.first; p_it != range.second; p_it++) {
+ psum = psum + *mesh->points_p0.At((*p_it).second);
+ }
+ fastf_t alpha = alpha_n(n);
+ //
+ // 3 an 1
+ // [pinf = ---------- * psum + -------- * p0]
+ // 3 an n + n 3 an + 1
+ //
+ ON_3dPoint pinf = (3*alpha/((3*alpha+1)*n))*psum + 1/(3*alpha+1) *
*mesh->points_p0.At(p);
+ p_a->Append(pinf);
}
// Kobbelt sqrt(3)-Subdivision, eqn. 8
void point_subdiv(size_t m, size_t p, struct Mesh_Info *mesh, ON_3dPointArray
*p_a) {
- size_t n = mesh->point_valence[p];
- point_inf(p, mesh, &mesh->points_inf);
- fastf_t gamma = pow((2/3 - alpha_n(n)),m);
- ON_3dPoint subdiv_pt = gamma * *mesh->points_p0.At(p) + (1-gamma) *
*mesh->points_inf.At(p);
- p_a->Append(subdiv_pt);
+ size_t n = mesh->point_valence[p];
+ point_inf(p, mesh, &mesh->points_inf);
+ fastf_t gamma = pow((2/3 - alpha_n(n)),m);
+ ON_3dPoint subdiv_pt = gamma * *mesh->points_p0.At(p) + (1-gamma) *
*mesh->points_inf.At(p);
+ p_a->Append(subdiv_pt);
}
// Make an edge using consistent vertex ordering
std::pair<size_t, size_t> mk_edge(size_t pt_A, size_t pt_B)
{
if (pt_A <= pt_B) {
- return std::make_pair(pt_A, pt_B);
+ return std::make_pair(pt_A, pt_B);
} else {
- return std::make_pair(pt_B, pt_A);
+ return std::make_pair(pt_B, pt_A);
}
}
@@ -126,7 +126,7 @@
mesh->iteration_of_insert[i] = 0;
}
for (size_t i = 0; i < bot->num_faces; ++i) {
- mesh_add_face(bot->faces[i*3+0], bot->faces[i*3+1], bot->faces[i*3+2],
i, mesh);
+ mesh_add_face(bot->faces[i*3+0], bot->faces[i*3+1], bot->faces[i*3+2],
i, mesh);
}
mesh->iteration_cnt = 0;
}
@@ -136,21 +136,22 @@
std::map<size_t, std::vector<size_t> >::iterator f_it;
std::vector<size_t>::iterator l_it;
for(f_it = mesh->face_pts.begin(); f_it != mesh->face_pts.end(); f_it++) {
- l_it = (*f_it).second.begin();
- edges->insert(mk_edge((*l_it), (*(l_it+1))));
- edges->insert(mk_edge((*(l_it+1)), (*(l_it+2))));
- edges->insert(mk_edge((*(l_it+2)), (*l_it)));
+ l_it = (*f_it).second.begin();
+ edges->insert(mk_edge((*l_it), (*(l_it+1))));
+ edges->insert(mk_edge((*(l_it+1)), (*(l_it+2))));
+ edges->insert(mk_edge((*(l_it+2)), (*l_it)));
}
}
-// Find faces with outer edge segments
-void get_outer_faces(struct Mesh_Info *mesh, std::set<size_t> *outer_faces) {
+// Find outer edge segments and vertices
+void get_boundaries(struct Mesh_Info *mesh, std::set<size_t> *outer_pts,
std::set<std::pair<size_t, size_t> > *outer_edges) {
std::map<std::pair<size_t, size_t>, std::set<size_t> >::iterator e_it;
for (e_it = mesh->edges_to_faces.begin();
e_it!=mesh->edges_to_faces.end(); e_it++) {
- if ((*e_it).second.size() == 1) {
- size_t face = *(*e_it).second.begin();
- outer_faces->insert(face);
- }
+ if ((*e_it).second.size() == 1) {
+ outer_edges->insert((*e_it).first);
+ outer_pts->insert((*e_it).first.first);
+ outer_pts->insert((*e_it).first.second);
+ }
}
}
@@ -172,49 +173,66 @@
find_q_pts(starting_mesh);
+ std::set<std::pair<size_t, size_t> > old_edges;
+ std::set<std::pair<size_t, size_t> >::iterator e_it;
+ get_all_edges(starting_mesh, &old_edges);
+ std::set<std::pair<size_t, size_t> > outer_edges;
+ std::set<size_t > outer_pts;
+ get_boundaries(starting_mesh, &outer_pts, &outer_edges);
+ std::cout << "outer pt count: " << outer_pts.size() << "\n";
+ std::cout << "outer edge count: " << outer_edges.size() << "\n";
+
// Relax old points here
for(size_t pcnt = 0; pcnt < (size_t)starting_mesh->points_p0.Count();
pcnt++) {
- point_subdiv(mesh->iteration_cnt, pcnt, starting_mesh,
&(mesh->points_p0));
- mesh->iteration_of_insert[pcnt] =
starting_mesh->iteration_of_insert[pcnt];
+ if (outer_pts.find(pcnt) == outer_pts.end()) {
+ point_subdiv(mesh->iteration_cnt, pcnt, starting_mesh,
&(mesh->points_p0));
+ mesh->iteration_of_insert[pcnt] =
starting_mesh->iteration_of_insert[pcnt];
+ } else {
+
starting_mesh->points_inf.Append(*starting_mesh->points_p0.At(pcnt));
+ mesh->points_p0.Append(*starting_mesh->points_p0.At(pcnt));
+ mesh->iteration_of_insert[pcnt] =
starting_mesh->iteration_of_insert[pcnt];
+ }
}
for(f_it = starting_mesh->face_pts.begin(); f_it !=
starting_mesh->face_pts.end(); f_it++) {
mesh->points_p0.Append(starting_mesh->points_q[(*f_it).first]);
mesh->iteration_of_insert[mesh->points_p0.Count()-1] =
mesh->iteration_cnt;
- starting_mesh->index_in_next[(*f_it).first] =
mesh->points_p0.Count()-1;
+ starting_mesh->index_in_next[(*f_it).first] = mesh->points_p0.Count()-1;
}
- // Use the old faces to guide the insertion of the new.
- std::set<std::pair<size_t, size_t> > old_edges;
- std::set<std::pair<size_t, size_t> >::iterator e_it;
- get_all_edges(starting_mesh, &old_edges);
- std::set<size_t > outer_faces;
- get_outer_faces(starting_mesh, &outer_faces);
- std::cout << "outer face count: " << outer_faces.size() << "\n";
- size_t face_cnt = 0;
- for(f_it = starting_mesh->face_pts.begin(); f_it !=
starting_mesh->face_pts.end(); f_it++) {
- if (outer_faces.find((*f_it).first) == outer_faces.end()) {
- std::set<std::pair<size_t, size_t> > face_old_edges;
- size_t q0 = starting_mesh->index_in_next[(*f_it).first];
- l_it = (*f_it).second.begin();
- face_old_edges.insert(std::make_pair((*l_it), (*(l_it+1))));
- face_old_edges.insert(std::make_pair((*(l_it+1)), (*(l_it+2))));
- face_old_edges.insert(std::make_pair((*(l_it+2)), (*l_it)));
- for(e_it = face_old_edges.begin(); e_it != face_old_edges.end();
e_it++) {
- std::pair<size_t, size_t> edge = mk_edge((*e_it).first,
(*e_it).second);
- if (old_edges.find((edge)) != old_edges.end()) {
- std::set<size_t> curr_faces =
starting_mesh->edges_to_faces[edge];
- curr_faces.erase((*f_it).first);
- size_t q1 =
starting_mesh->index_in_next[*curr_faces.begin()];
- mesh_add_face((*e_it).first, q1, q0, face_cnt, mesh);
- face_cnt++;
- mesh_add_face((*e_it).second, q0, q1, face_cnt, mesh);
- face_cnt++;
- old_edges.erase(edge);
- }
- }
- }
- }
- delete starting_mesh;
- return mesh;
+ // Use the old faces to guide the insertion of the new.
+ size_t face_cnt = 0;
+ for(f_it = starting_mesh->face_pts.begin(); f_it !=
starting_mesh->face_pts.end(); f_it++) {
+ std::set<std::pair<size_t, size_t> > face_old_edges;
+ size_t q0 = starting_mesh->index_in_next[(*f_it).first];
+ l_it = (*f_it).second.begin();
+ face_old_edges.insert(std::make_pair((*l_it), (*(l_it+1))));
+ face_old_edges.insert(std::make_pair((*(l_it+1)), (*(l_it+2))));
+ face_old_edges.insert(std::make_pair((*(l_it+2)), (*l_it)));
+ for(e_it = face_old_edges.begin(); e_it != face_old_edges.end();
e_it++) {
+ std::pair<size_t, size_t> edge = mk_edge((*e_it).first,
(*e_it).second);
+ if (old_edges.find(edge) != old_edges.end()) {
+ if (outer_edges.find(edge) == outer_edges.end()) {
+ std::set<size_t> curr_faces =
starting_mesh->edges_to_faces[edge];
+ curr_faces.erase((*f_it).first);
+ size_t q1 =
starting_mesh->index_in_next[*curr_faces.begin()];
+ mesh_add_face((*e_it).first, q1, q0, face_cnt, mesh);
+ face_cnt++;
+ mesh_add_face((*e_it).second, q0, q1, face_cnt, mesh);
+ face_cnt++;
+ old_edges.erase(edge);
+ } else {
+ //if (mesh->iteration_cnt % 2 == 0) {
+ std::cout << "second iteration: " << q0 << "\n";
+ //} else {
+ mesh_add_face((*e_it).first, (*e_it).second, q0,
face_cnt, mesh);
+ face_cnt++;
+ old_edges.erase(edge);
+ //}
+ }
+ }
+ }
+ }
+ delete starting_mesh;
+ return mesh;
}
int main(int argc, char *argv[])
@@ -249,9 +267,9 @@
}
RT_DB_INTERNAL_INIT(&intern)
- if (rt_db_get_internal(&intern, dp, dbip, NULL, &rt_uniresource) < 0) {
- bu_exit(1, "ERROR: Unable to get internal representation of %s\n",
argv[2]);
- }
+ if (rt_db_get_internal(&intern, dp, dbip, NULL, &rt_uniresource) < 0) {
+ bu_exit(1, "ERROR: Unable to get internal representation of %s\n",
argv[2]);
+ }
if (intern.idb_minor_type != DB5_MINORTYPE_BRLCAD_BOT) {
bu_exit(1, "ERROR: object %s does not appear to be of type BoT\n",
argv[2]);
@@ -260,11 +278,11 @@
}
RT_BOT_CK_MAGIC(bot_ip);
- for (size_t i_cnt = 1; i_cnt < 5; i_cnt++) {
- mesh = iterate(bot_ip, prev_mesh);
- prev_mesh = mesh;
+ for (size_t i_cnt = 1; i_cnt < 3; i_cnt++) {
+ mesh = iterate(bot_ip, prev_mesh);
+ prev_mesh = mesh;
- // Plot results
+ // Plot results
struct bu_vls fname;
bu_vls_init(&fname);
bu_vls_printf(&fname, "root3_%d.pl", i_cnt);
@@ -299,9 +317,9 @@
}
scale = scale / bot_ip->num_vertices;
for(size_t pcnt = 0; pcnt < (size_t)points_inf.Count(); pcnt++) {
- ON_3dPoint p0(*points_inf.At(pcnt));
- ON_3dPoint p1 = p0 * scale;
- *points_inf.At(pcnt) = p1;
+ ON_3dPoint p0(*points_inf.At(pcnt));
+ ON_3dPoint p1 = p0 * scale;
+ *points_inf.At(pcnt) = p1;
}
wdbp = wdb_dbopen(dbip, RT_WDB_TYPE_DB_DISK);
@@ -309,17 +327,17 @@
fastf_t *vertices = (fastf_t *)bu_malloc(sizeof(fastf_t) *
points_inf.Count() * 3, "new verts");
int *faces = (int *)bu_malloc(sizeof(int) * mesh->face_pts.size() * 3,
"new faces");
for(size_t v = 0; v < (size_t)points_inf.Count(); v++) {
- vertices[v*3] = points_inf[v].x;
- vertices[v*3+1] = points_inf[v].y;
- vertices[v*3+2] = points_inf[v].z;
+ vertices[v*3] = points_inf[v].x;
+ vertices[v*3+1] = points_inf[v].y;
+ vertices[v*3+2] = points_inf[v].z;
}
std::map<size_t, std::vector<size_t> >::iterator f_it;
std::vector<size_t>::iterator l_it;
for(f_it = mesh->face_pts.begin(); f_it != mesh->face_pts.end(); f_it++) {
- l_it = (*f_it).second.begin();
- faces[(*f_it).first*3] = (*l_it);
- faces[(*f_it).first*3+1] = (*(l_it + 1));
- faces[(*f_it).first*3+2] = (*(l_it + 2));
+ l_it = (*f_it).second.begin();
+ faces[(*f_it).first*3] = (*l_it);
+ faces[(*f_it).first*3+1] = (*(l_it + 1));
+ faces[(*f_it).first*3+2] = (*(l_it + 2));
}
bu_vls_init(&bname);
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits