Revision: 71574
          http://sourceforge.net/p/brlcad/code/71574
Author:   starseeker
Date:     2018-08-24 15:18:13 +0000 (Fri, 24 Aug 2018)
Log Message:
-----------
Update the libanalyze point generation routine to optionally return the average 
partition thickness observed along the rays during sampling.

Modified Paths:
--------------
    brlcad/trunk/include/analyze.h
    brlcad/trunk/src/libanalyze/obj_to_pnts.c
    brlcad/trunk/src/libged/facetize.c
    brlcad/trunk/src/libged/pnts.cpp

Modified: brlcad/trunk/include/analyze.h
===================================================================
--- brlcad/trunk/include/analyze.h      2018-08-24 14:36:10 UTC (rev 71573)
+++ brlcad/trunk/include/analyze.h      2018-08-24 15:18:13 UTC (rev 71574)
@@ -361,7 +361,7 @@
 #define ANALYZE_OBJ_TO_PNTS_GRID  0x2 /**< @brief sample using an XYZ grid 
based on the bounding box (default if no method flags are specified) */
 #define ANALYZE_OBJ_TO_PNTS_RAND  0x4 /**< @brief sample using Marsaglia 
sampling on the bounding sphere with pseudo random numbers */
 #define ANALYZE_OBJ_TO_PNTS_SOBOL 0x8 /**< @brief sample using Marsaglia 
sampling on the bounding sphere with Sobol' low-discrepancy-sequence generation 
*/
-ANALYZE_EXPORT int analyze_obj_to_pnts(struct rt_pnts_internal *rpnts, struct 
db_i *dbip,
+ANALYZE_EXPORT int analyze_obj_to_pnts(struct rt_pnts_internal *rpnts, double 
*avg_thickness, struct db_i *dbip,
               const char *obj, struct bn_tol *tol, int flags, int max_pnts, 
int max_time);
 
 

Modified: brlcad/trunk/src/libanalyze/obj_to_pnts.c
===================================================================
--- brlcad/trunk/src/libanalyze/obj_to_pnts.c   2018-08-24 14:36:10 UTC (rev 
71573)
+++ brlcad/trunk/src/libanalyze/obj_to_pnts.c   2018-08-24 15:18:13 UTC (rev 
71574)
@@ -36,6 +36,27 @@
 #include "analyze.h"
 #include "./analyze_private.h"
 
+struct pnt_normal_thickness {
+    struct pnt_normal *pt;
+    fastf_t thickness;
+};
+
+struct pnt_normal_thickness *
+pnthickness_create() {
+    struct pnt_normal_thickness *p;
+    BU_GET(p, struct pnt_normal_thickness);
+    BU_ALLOC(p->pt, struct pnt_normal);
+    return p;
+}
+
+/* Deliberately don't destroy p->pt, as (locally)
+ * it is used to construct the final pnts object */
+void
+pnthickness_free(struct pnt_normal_thickness *p) {
+    if (!p) return;
+    BU_PUT(p, struct pnt_normal_thickness);
+}
+
 HIDDEN void
 _tgc_hack_fix(struct partition *part, struct soltab *stp) {
     /* hack fix for bad tgc surfaces - avoids a logging crash, which is 
probably something else altogether... */
@@ -54,7 +75,8 @@
 HIDDEN int
 outer_pnts_hit(struct application *ap, struct partition *PartHeadp, struct seg 
*UNUSED(segs))
 {
-    struct pnt_normal *in_pt, *out_pt;
+    double thickness = 0.0;
+    struct pnt_normal_thickness *in_pt, *out_pt;
     struct partition *in_part = PartHeadp->pt_forw;
     struct partition *out_part = PartHeadp->pt_back;
     struct soltab *stp = in_part->pt_inseg->seg_stp;
@@ -67,17 +89,22 @@
     _tgc_hack_fix(in_part, stp);
     _tgc_hack_fix(out_part, ostp);
 
-    BU_ALLOC(in_pt, struct pnt_normal);
-    VJOIN1(in_pt->v, ap->a_ray.r_pt, in_part->pt_inhit->hit_dist, 
ap->a_ray.r_dir);
-    RT_HIT_NORMAL(in_pt->n, in_part->pt_inhit, stp, &(app->a_ray), 
in_part->pt_inflip);
+    in_pt = pnthickness_create();
+    VJOIN1(in_pt->pt->v, ap->a_ray.r_pt, in_part->pt_inhit->hit_dist, 
ap->a_ray.r_dir);
+    RT_HIT_NORMAL(in_pt->pt->n, in_part->pt_inhit, stp, &(app->a_ray), 
in_part->pt_inflip);
+    in_pt->thickness = 0.0;
     bu_ptbl_ins(pnset, (long *)in_pt);
 
     /* add "out" hit point info (unless half-space) */
     if (bu_strncmp("half", ostp->st_meth->ft_label, 4) != 0) {
-       BU_ALLOC(out_pt, struct pnt_normal);
-       VJOIN1(out_pt->v, ap->a_ray.r_pt, out_part->pt_outhit->hit_dist, 
ap->a_ray.r_dir);
-       RT_HIT_NORMAL(out_pt->n, out_part->pt_outhit, ostp, &(app->a_ray), 
out_part->pt_outflip);
+       out_pt = pnthickness_create();
+       VJOIN1(out_pt->pt->v, ap->a_ray.r_pt, out_part->pt_outhit->hit_dist, 
ap->a_ray.r_dir);
+       RT_HIT_NORMAL(out_pt->pt->n, out_part->pt_outhit, ostp, &(app->a_ray), 
out_part->pt_outflip);
        bu_ptbl_ins(pnset, (long *)out_pt);
+
+       thickness = DIST_PT_PT(in_pt->pt->v, out_pt->pt->v) * 0.5;
+       in_pt->thickness = thickness;
+       out_pt->thickness = thickness;
     }
 
     return 0;
@@ -86,7 +113,8 @@
 HIDDEN int
 all_pnts_hit(struct application *app, struct partition *partH, struct seg 
*UNUSED(segs))
 {
-    struct pnt_normal *pt;
+    double thickness = 0.0;
+    struct pnt_normal_thickness *in_pt, *out_pt;
     struct partition *pp;
     struct soltab *stp;
     struct rt_gen_worker_vars *s = (struct rt_gen_worker_vars *)(app->a_uptr);
@@ -100,17 +128,22 @@
        /* always add in hit */
        stp = pp->pt_inseg->seg_stp;
        _tgc_hack_fix(pp, stp);
-       BU_ALLOC(pt, struct pnt_normal);
-       VJOIN1(pt->v, app->a_ray.r_pt, pp->pt_inhit->hit_dist, 
app->a_ray.r_dir);
-       RT_HIT_NORMAL(pt->n, pp->pt_inhit, stp, &(app->a_ray), pp->pt_inflip);
-       bu_ptbl_ins(pnset, (long *)pt);
+       in_pt = pnthickness_create();
+       VJOIN1(in_pt->pt->v, app->a_ray.r_pt, pp->pt_inhit->hit_dist, 
app->a_ray.r_dir);
+       RT_HIT_NORMAL(in_pt->pt->n, pp->pt_inhit, stp, &(app->a_ray), 
pp->pt_inflip);
+       in_pt->thickness = 0.0;
+       bu_ptbl_ins(pnset, (long *)in_pt);
 
        /* add "out" hit point unless it's a half-space */
        if (bu_strncmp("half", stp->st_meth->ft_label, 4) != 0) {
-           BU_ALLOC(pt, struct pnt_normal);
-           VJOIN1(pt->v, app->a_ray.r_pt, pp->pt_outhit->hit_dist, 
app->a_ray.r_dir);
-           RT_HIT_NORMAL(pt->n, pp->pt_outhit, stp, &(app->a_ray), 
pp->pt_outflip);
-           bu_ptbl_ins(pnset, (long *)pt);
+           out_pt = pnthickness_create();
+           VJOIN1(out_pt->pt->v, app->a_ray.r_pt, pp->pt_outhit->hit_dist, 
app->a_ray.r_dir);
+           RT_HIT_NORMAL(out_pt->pt->n, pp->pt_outhit, stp, &(app->a_ray), 
pp->pt_outflip);
+           bu_ptbl_ins(pnset, (long *)out_pt);
+
+           thickness = DIST_PT_PT(in_pt->pt->v, out_pt->pt->v) * 0.5;
+           in_pt->thickness = thickness;
+           out_pt->thickness = thickness;
        }
     }
 
@@ -201,7 +234,7 @@
 
 /* 0 = success, -1 error */
 int
-analyze_obj_to_pnts(struct rt_pnts_internal *rpnts, struct db_i *dbip,
+analyze_obj_to_pnts(struct rt_pnts_internal *rpnts, fastf_t *avg_thickness, 
struct db_i *dbip,
        const char *obj, struct bn_tol *tol, int flags, int max_pnts, int 
max_time)
 {
     int pntcnt = 0;
@@ -210,6 +243,7 @@
     fastf_t oldtime, currtime;
     int ind = 0;
     int count = 0;
+    double avgt = 0.0;
     struct rt_i *rtip;
     int ncpus = bu_avail_cpus();
     struct rt_gen_worker_vars *state = (struct rt_gen_worker_vars 
*)bu_calloc(ncpus+1, sizeof(struct rt_gen_worker_vars ), "state");
@@ -392,6 +426,8 @@
        ret = ANALYZE_ERROR;
     } else {
        int pc = 0;
+       int total_pnts = 0;
+       long double thickness_total = 0.0;
        rpnts->count = pntcnt;
        BU_ALLOC(rpnts->point, struct pnt_normal);
        BU_LIST_INIT(&(((struct pnt_normal *)rpnts->point)->l));
@@ -400,7 +436,11 @@
            pc = 0;
            for (i = 0; i < ncpus+1; i++) {
                for (j = 0; j < (int)BU_PTBL_LEN(grid_pnts[i]); j++) {
-                   BU_LIST_PUSH(&(((struct pnt_normal *)rpnts->point)->l), 
&((struct pnt_normal *)BU_PTBL_GET(grid_pnts[i], j))->l);
+                   struct pnt_normal_thickness *pnthick = (struct 
pnt_normal_thickness *)BU_PTBL_GET(grid_pnts[i], j);
+                   BU_LIST_PUSH(&(((struct pnt_normal *)rpnts->point)->l), 
&(pnthick->pt)->l);
+                   thickness_total += pnthick->thickness;
+                   BU_PUT(pnthick, struct pnt_normal_thickness);
+                   total_pnts++;
                    pc++;
                    if (pc == pntcnt_grid) break;
                }
@@ -412,7 +452,11 @@
            pc = 0;
            for (i = 0; i < ncpus+1; i++) {
                for (j = 0; j < (int)BU_PTBL_LEN(rand_pnts[i]); j++) {
-                   BU_LIST_PUSH(&(((struct pnt_normal *)rpnts->point)->l), 
&((struct pnt_normal *)BU_PTBL_GET(rand_pnts[i], j))->l);
+                   struct pnt_normal_thickness *pnthick = (struct 
pnt_normal_thickness *)BU_PTBL_GET(rand_pnts[i], j);
+                   BU_LIST_PUSH(&(((struct pnt_normal *)rpnts->point)->l), 
&(pnthick->pt)->l);
+                   thickness_total += pnthick->thickness;
+                   BU_PUT(pnthick, struct pnt_normal_thickness);
+                   total_pnts++;
                    pc++;
                    if (pc == pntcnt_rand) break;
                }
@@ -424,7 +468,11 @@
            pc = 0;
            for (i = 0; i < ncpus+1; i++) {
                for (j = 0; j < (int)BU_PTBL_LEN(sobol_pnts[i]); j++) {
-                   BU_LIST_PUSH(&(((struct pnt_normal *)rpnts->point)->l), 
&((struct pnt_normal *)BU_PTBL_GET(sobol_pnts[i], j))->l);
+                   struct pnt_normal_thickness *pnthick = (struct 
pnt_normal_thickness *)BU_PTBL_GET(sobol_pnts[i], j);
+                   BU_LIST_PUSH(&(((struct pnt_normal *)rpnts->point)->l), 
&(pnthick->pt)->l);
+                   thickness_total += pnthick->thickness;
+                   BU_PUT(pnthick, struct pnt_normal_thickness);
+                   total_pnts++;
                    pc++;
                    if (pc == pntcnt_sobol) break;
                }
@@ -432,8 +480,12 @@
            }
        }
        ret = 0;
+
+       avgt = thickness_total / (double)total_pnts;
+       if (avg_thickness) (*avg_thickness) = avgt;
     }
 
+
 memfree:
     /* Free memory not stored in tables */
     for (i = 0; i < ncpus+1; i++) {

Modified: brlcad/trunk/src/libged/facetize.c
===================================================================
--- brlcad/trunk/src/libged/facetize.c  2018-08-24 14:36:10 UTC (rev 71573)
+++ brlcad/trunk/src/libged/facetize.c  2018-08-24 15:18:13 UTC (rev 71574)
@@ -770,7 +770,7 @@
            bu_vls_free(&pnt_msg);
        }
 
-       if (analyze_obj_to_pnts(pnts, gedp->ged_wdbp->dbip, objname, &btol, 
flags, opts->max_pnts, opts->max_time)) {
+       if (analyze_obj_to_pnts(pnts, NULL, gedp->ged_wdbp->dbip, objname, 
&btol, flags, opts->max_pnts, opts->max_time)) {
            if (!opts->quiet) {
                bu_log("SPSR: point generation failed: %s\n", objname);
            }

Modified: brlcad/trunk/src/libged/pnts.cpp
===================================================================
--- brlcad/trunk/src/libged/pnts.cpp    2018-08-24 14:36:10 UTC (rev 71573)
+++ brlcad/trunk/src/libged/pnts.cpp    2018-08-24 15:18:13 UTC (rev 71574)
@@ -267,6 +267,7 @@
     int max_pnts = 0;
     int max_time = 0;
     int flags = 0;
+    double avg_thickness = 0.0;
     struct rt_db_internal internal;
     struct bn_tol btol = {BN_TOL_MAGIC, BN_TOL_DIST, BN_TOL_DIST * 
BN_TOL_DIST, 1e-6, 1.0 - 1e-6 };
     struct rt_pnts_internal *pnts = NULL;
@@ -359,7 +360,7 @@
     pnts->scale = 0.0;
     pnts->type = RT_PNT_TYPE_NRM;
 
-    if (analyze_obj_to_pnts(pnts, gedp->ged_wdbp->dbip, obj_name, &btol, 
flags, max_pnts, max_time)) {
+    if (analyze_obj_to_pnts(pnts, &avg_thickness, gedp->ged_wdbp->dbip, 
obj_name, &btol, flags, max_pnts, max_time)) {
        bu_vls_sprintf(gedp->ged_result_str, "Error: point generation 
failed\n");
        return GED_ERROR;
     }
@@ -367,7 +368,7 @@
     GED_DB_DIRADD(gedp, dp, pnt_prim, RT_DIR_PHONY_ADDR, 0, RT_DIR_SOLID, 
(void *)&internal.idb_type, GED_ERROR);
     GED_DB_PUT_INTERNAL(gedp, dp, &internal, &rt_uniresource, GED_ERROR);
 
-    bu_vls_printf(gedp->ged_result_str, "Generated pnts object %s with %d 
points", pnt_prim, pnts->count);
+    bu_vls_printf(gedp->ged_result_str, "Generated pnts object %s with %d 
points, avg. partition thickness %g", pnt_prim, pnts->count, avg_thickness);
 
     return GED_OK;
 }

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
BRL-CAD Source Commits mailing list
brlcad-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to