Revision: 73036
http://sourceforge.net/p/brlcad/code/73036
Author: starseeker
Date: 2019-05-09 19:29:06 +0000 (Thu, 09 May 2019)
Log Message:
-----------
Get a quick approximation of the 3D length of the surface UV edges.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt.cpp
Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp 2019-05-09 17:38:11 UTC (rev 73035)
+++ brlcad/trunk/src/libbrep/cdt.cpp 2019-05-09 19:29:06 UTC (rev 73036)
@@ -1006,6 +1006,82 @@
}
+/* flags identifying which side of the surface we're calculating
+ *
+ * u_upper
+ * (1,0)
+ *
+ * u1v2---------------- u2v2
+ * | |
+ * | |
+ * | |
+ * v_lower | | v_upper
+ * (0,1) | | (1,1)
+ * | |
+ * | |
+ * u1v1-----------------u2v1
+ *
+ * u_lower
+ * (0,0)
+ */
+double
+_cdt_get_uv_edge_3d_len(const ON_Surface *s, int c1, int c2)
+{
+ double u1, u2, v1, v2;
+ s->GetDomain(0, &u1, &u2);
+ s->GetDomain(1, &v1, &v2);
+ double wu1, wv1, wu2, wv2, umid, vmid;
+
+ if (!c1 && !c2) {
+ wu1 = u1;
+ wu2 = u2;
+ wv1 = v1;
+ wv2 = v1;
+ umid = (u2 - u1)/2.0;
+ vmid = v1;
+ }
+ if (c1 && !c2) {
+ wu1 = u1;
+ wu2 = u2;
+ wv1 = v2;
+ wv2 = v2;
+ umid = (u2 - u1)/2.0;
+ vmid = v2;
+ }
+ if (!c1 && c2) {
+ wu1 = u1;
+ wu2 = u1;
+ wv1 = v1;
+ wv2 = v2;
+ umid = u1;
+ vmid = (v2 - v1)/2.0;
+ }
+ if (c1 && c2) {
+ wu1 = u2;
+ wu2 = u2;
+ wv1 = v1;
+ wv2 = v2;
+ umid = u2;
+ vmid = (v2 - v1)/2.0;
+ }
+
+ // 1st 3d point
+ ON_3dPoint p1 = s->PointAt(wu1, wv1);
+
+ // middle 3d point
+ ON_3dPoint pmid = s->PointAt(umid, vmid);
+
+ // last 3d point
+ ON_3dPoint p2 = s->PointAt(wu2, wv2);
+
+ // length
+ double d1 = pmid.DistanceTo(p1);
+ double d2 = p2.DistanceTo(pmid);
+ return d1+d2;
+}
+
+
+
static void
getSurfacePoints(struct ON_Brep_CDT_State *s_cdt,
const ON_BrepFace &face,
@@ -1016,10 +1092,6 @@
const ON_Surface *s = face.SurfaceOf();
const ON_Brep *brep = face.Brep();
- struct cdt_surf_info sinfo;
-
- sinfo.s = s;
-
if (s->GetSurfaceSize(&surface_width, &surface_height)) {
double dist = 0.0;
double min_dist = 0.0;
@@ -1030,6 +1102,23 @@
return;
}
+ struct cdt_surf_info sinfo;
+ sinfo.s = s;
+ double t1, t2;
+ s->GetDomain(0, &t1, &t2);
+ sinfo.ulen = fabs(t2 - t1);
+ s->GetDomain(1, &t1, &t2);
+ sinfo.vlen = fabs(t2 - t1);
+ sinfo.u_lower_3dlen = _cdt_get_uv_edge_3d_len(s, 0, 0);
+ sinfo.u_upper_3dlen = _cdt_get_uv_edge_3d_len(s, 1, 0);
+ sinfo.v_lower_3dlen = _cdt_get_uv_edge_3d_len(s, 0, 1);
+ sinfo.v_upper_3dlen = _cdt_get_uv_edge_3d_len(s, 1, 1);
+ bu_log("u_lower_3dlen: %f\n",_cdt_get_uv_edge_3d_len(s, 0, 0));
+ bu_log("u_upper_3dlen: %f\n",_cdt_get_uv_edge_3d_len(s, 1, 0));
+ bu_log("v_lower_3dlen: %f\n",_cdt_get_uv_edge_3d_len(s, 0, 1));
+ bu_log("v_upper_3dlen: %f\n",_cdt_get_uv_edge_3d_len(s, 1, 1));
+
+
// may be a smaller trimmed subset of surface so worth getting
// face boundary
bool bGrowBox = false;
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits