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

Reply via email to