Revision: 73040
http://sourceforge.net/p/brlcad/code/73040
Author: starseeker
Date: 2019-05-10 16:06:32 +0000 (Fri, 10 May 2019)
Log Message:
-----------
checkpoint
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt.cpp
Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp 2019-05-10 04:33:24 UTC (rev 73039)
+++ brlcad/trunk/src/libbrep/cdt.cpp 2019-05-10 16:06:32 UTC (rev 73040)
@@ -56,6 +56,8 @@
#include "brep/pullback.h"
#include "brep/util.h"
+int print_debug = 0;
+
/***************************************************
* debugging routines
***************************************************/
@@ -792,9 +794,11 @@
double u1, u2, v1, v2;
fastf_t ulen;
fastf_t u_lower_3dlen;
+ fastf_t u_mid_3dlen;
fastf_t u_upper_3dlen;
fastf_t vlen;
fastf_t v_lower_3dlen;
+ fastf_t v_mid_3dlen;
fastf_t v_upper_3dlen;
};
@@ -801,9 +805,20 @@
double
uline_len_est(struct cdt_surf_info *sinfo, double u1, double u2, double v)
{
- double t = 1 - (sinfo->vlen - v)/(sinfo->vlen);
- double lenfact = sinfo->u_lower_3dlen * (1 - (t)) + sinfo->u_upper_3dlen *
(t);
- double lenest = (u2 - u1)/sinfo->ulen * lenfact;
+ double vp, t, lenfact, lenest;
+ int active_half = (fabs(sinfo->v1 - v) < fabs(sinfo->v2 - v)) ? 0 : 1;
+ vp = (active_half == 0) ? fabs(sinfo->v1 - v)/(sinfo->vlen*0.5) :
fabs(sinfo->v2 - v)/(sinfo->vlen*0.5);
+ t = 1 - (sinfo->vlen*0.5 - vp)/(sinfo->vlen*0.5);
+ if (active_half == 0) {
+ lenfact = sinfo->u_lower_3dlen * (1 - (t)) + sinfo->u_mid_3dlen * (t);
+ lenest = (u2 - u1)/sinfo->ulen * lenfact;
+ } else {
+ lenfact = sinfo->u_mid_3dlen * (1 - (t)) + sinfo->u_upper_3dlen * (t);
+ lenest = (u2 - u1)/sinfo->ulen * lenfact;
+ }
+ if (print_debug) {
+ bu_log("active_half: %d u1:%f u2:%f v: %f -> vp: %f t: %f lenfact: %f
lenest: %f\n", active_half, u1, u2, v,vp, t, lenfact, lenest);
+ }
return lenest;
}
@@ -811,9 +826,21 @@
double
vline_len_est(struct cdt_surf_info *sinfo, double u, double v1, double v2)
{
- double t = 1 - (sinfo->ulen - u)/(sinfo->ulen);
- double lenfact = sinfo->v_lower_3dlen * (1 - (t)) + sinfo->v_upper_3dlen *
(t);
- double lenest = (v2 - v1)/sinfo->vlen * lenfact;
+ double up, t, lenfact, lenest;
+ int active_half = (fabs(sinfo->u1 - u) < fabs(sinfo->u2 - u)) ? 0 : 1;
+ up = (active_half == 0) ? fabs(sinfo->u1 - u)/(sinfo->ulen*0.5) :
fabs(sinfo->u2 - u)/(sinfo->ulen*0.5);
+ t = 1 - (sinfo->ulen*0.5 - up)/(sinfo->ulen*0.5);
+ if (active_half == 0) {
+ lenfact = sinfo->v_lower_3dlen * (1 - (t)) + sinfo->v_mid_3dlen * (t);
+ lenest = (v2 - v1)/sinfo->vlen * lenfact;
+ } else {
+ lenfact = sinfo->v_mid_3dlen * (1 - (t)) + sinfo->v_upper_3dlen * (t);
+ lenest = (v2 - v1)/sinfo->vlen * lenfact;
+ }
+
+ if (print_debug) {
+ bu_log("active_half: %d u:%f v1:%f v2: %f -> up: %f t: %f lenfact: %f
lenest: %f\n", active_half, u, v1, v2, up, t, lenfact, lenest);
+ }
return lenest;
}
@@ -864,10 +891,12 @@
// If they're both less than threshold, skip
double est1 = vline_len_est(sinfo, u1, v1, v2);
double est2 = vline_len_est(sinfo, u1+step, v1, v2);
+ if (print_debug) {
if (est1 < min_dist && est2 < min_dist) {
bu_log("Small estimates: %f, %f\n", est1, est2);
continue;
}
+ }
getSurfacePoints(sinfo, u1, u1 + step, v1, v2, min_dist,
within_dist, cos_within_ang, on_surf_points, left,
below);
@@ -877,10 +906,12 @@
// If they're both less than threshold, skip
double est1 = vline_len_est(sinfo, u2-step, v1, v2);
double est2 = vline_len_est(sinfo, u2, v1, v2);
+ if (print_debug) {
if (est1 < min_dist && est2 < min_dist) {
bu_log("Small estimates: %f, %f\n", est1, est2);
continue;
}
+ }
getSurfacePoints(sinfo, u2 - step, u2, v1, v2, min_dist,
within_dist, cos_within_ang, on_surf_points, left,
@@ -890,10 +921,12 @@
// If they're both less than threshold, skip
double est1 = vline_len_est(sinfo, step_u - step, v1, v2);
double est2 = vline_len_est(sinfo, step_u, v1, v2);
+ if (print_debug) {
if (est1 < min_dist && est2 < min_dist) {
bu_log("Small estimates: %f, %f\n", est1, est2);
continue;
}
+ }
getSurfacePoints(sinfo, step_u - step, step_u, v1, v2,
min_dist, within_dist,
cos_within_ang, on_surf_points, left, below);
@@ -923,11 +956,13 @@
if (i == 1) {
double est1 = uline_len_est(sinfo, u1, u2, v1);
double est2 = uline_len_est(sinfo, u1, u2, v1 + step);
+ if (print_debug) {
bu_log("est1, est2: %f, %f\n", est1, est2);
if (est1 < min_dist && est2 < min_dist) {
bu_log("Small estimates: %f, %f\n", est1, est2);
continue;
}
+ }
getSurfacePoints(sinfo, u1, u2, v1, v1 + step, min_dist,
within_dist, cos_within_ang, on_surf_points, left,
@@ -935,11 +970,13 @@
} else if (i == isteps) {
double est1 = uline_len_est(sinfo, u1, u2, v2 - step);
double est2 = uline_len_est(sinfo, u1, u2, v2);
+ if (print_debug) {
bu_log("est1, est2: %f, %f\n", est1, est2);
if (est1 < min_dist && est2 < min_dist) {
bu_log("Small estimates: %f, %f\n", est1, est2);
continue;
}
+ }
getSurfacePoints(sinfo, u1, u2, v2 - step, v2, min_dist,
within_dist, cos_within_ang, on_surf_points, left,
@@ -947,11 +984,13 @@
} else {
double est1 = uline_len_est(sinfo, u1, u2, step_v - step);
double est2 = uline_len_est(sinfo, u1, u2, step_v);
+ if (print_debug) {
bu_log("est1, est2: %f, %f\n", est1, est2);
if (est1 < min_dist && est2 < min_dist) {
bu_log("Small estimates: %f, %f\n", est1, est2);
continue;
}
+ }
getSurfacePoints(sinfo, u1, u2, step_v - step, step_v,
min_dist, within_dist,
cos_within_ang, on_surf_points, left, below);
@@ -973,13 +1012,17 @@
double est3 = vline_len_est(sinfo, u1, v1, v2);
double est4 = vline_len_est(sinfo, u2, v1, v2);
- bu_log("est1, est2, est3, est4: %f, %f, %f, %f\n", est1, est2, est3, est4);
- if (est1 < min_dist && est2 < min_dist) {
+ if (print_debug) {
+ bu_log("(min: %f) est1, est2, est3, est4: %f, %f, %f, %f\n", min_dist,
est1, est2, est3, est4);
+ if (est1 < 0.5 && est2 < 0.5) {
bu_log("Small estimates: %f, %f\n", est1, est2);
+ return;
}
- if (est3 < min_dist && est4 < min_dist) {
+ if (est3 < 0.5 && est4 < 0.5) {
bu_log("Small estimates: %f, %f\n", est3, est4);
+ return;
}
+ }
if ((surface_EvNormal(sinfo->s, u1, v1, p[0], norm[0]))
@@ -1098,16 +1141,16 @@
/* flags identifying which side of the surface we're calculating
*
* u_upper
- * (1,0)
+ * (2,0)
*
* u1v2---------------- u2v2
- * | |
- * | |
- * | |
- * v_lower | | v_upper
- * (0,1) | | (1,1)
- * | |
- * | |
+ * | | |
+ * | | |
+ * | u_lmid | |
+ * v_lower |----------|---------| v_upper
+ * (0,1) | (1,0) | | (2,1)
+ * | v|lmid |
+ * | |(1,1) |
* u1v1-----------------u2v1
*
* u_lower
@@ -1116,9 +1159,11 @@
double
_cdt_get_uv_edge_3d_len(struct cdt_surf_info *sinfo, int c1, int c2)
{
+ int line_set = 0;
double wu1, wv1, wu2, wv2, umid, vmid = 0.0;
- if (!c1 && !c2) {
+ /* u_lower */
+ if (c1 == 0 && c2 == 0) {
wu1 = sinfo->u1;
wu2 = sinfo->u2;
wv1 = sinfo->v1;
@@ -1125,16 +1170,33 @@
wv2 = sinfo->v1;
umid = (sinfo->u2 - sinfo->u1)/2.0;
vmid = sinfo->v1;
+ line_set = 1;
}
- if (c1 && !c2) {
+
+ /* u_lmid */
+ if (c1 == 1 && c2 == 0) {
wu1 = sinfo->u1;
wu2 = sinfo->u2;
+ wv1 = (sinfo->v2 - sinfo->v1)/2.0;
+ wv2 = (sinfo->v2 - sinfo->v1)/2.0;
+ umid = (sinfo->u2 - sinfo->u1)/2.0;
+ vmid = (sinfo->v2 - sinfo->v1)/2.0;
+ line_set = 1;
+ }
+
+ /* u_upper */
+ if (c1 == 2 && c2 == 0) {
+ wu1 = sinfo->u1;
+ wu2 = sinfo->u2;
wv1 = sinfo->v2;
wv2 = sinfo->v2;
umid = (sinfo->u2 - sinfo->u1)/2.0;
vmid = sinfo->v2;
+ line_set = 1;
}
- if (!c1 && c2) {
+
+ /* v_lower */
+ if (c1 == 0 && c2 == 1) {
wu1 = sinfo->u1;
wu2 = sinfo->u1;
wv1 = sinfo->v1;
@@ -1141,8 +1203,22 @@
wv2 = sinfo->v2;
umid = sinfo->u1;
vmid = (sinfo->v2 - sinfo->v1)/2.0;
+ line_set = 1;
}
- if (c1 && c2) {
+
+ /* v_lmid */
+ if (c1 == 1 && c2 == 1) {
+ wu1 = (sinfo->u2 - sinfo->u1)/2.0;
+ wu2 = (sinfo->u2 - sinfo->u1)/2.0;
+ wv1 = sinfo->v1;
+ wv2 = sinfo->v2;
+ umid = (sinfo->u2 - sinfo->u1)/2.0;
+ vmid = (sinfo->v2 - sinfo->v1)/2.0;
+ line_set = 1;
+ }
+
+ /* v_upper */
+ if (c1 == 2 && c2 == 1) {
wu1 = sinfo->u2;
wu2 = sinfo->u2;
wv1 = sinfo->v1;
@@ -1149,8 +1225,14 @@
wv2 = sinfo->v2;
umid = sinfo->u2;
vmid = (sinfo->v2 - sinfo->v1)/2.0;
+ line_set = 1;
}
+ if (!line_set) {
+ bu_log("Invalid edge %d, %d specified\n", c1, c2);
+ return DBL_MAX;
+ }
+
// 1st 3d point
ON_3dPoint p1 = sinfo->s->PointAt(wu1, wv1);
@@ -1178,6 +1260,8 @@
const ON_Surface *s = face.SurfaceOf();
const ON_Brep *brep = face.Brep();
+ print_debug = 0;
+
if (s->GetSurfaceSize(&surface_width, &surface_height)) {
double dist = 0.0;
double min_dist = 0.0;
@@ -1198,17 +1282,32 @@
s->GetDomain(0, &sinfo.u1, &sinfo.u2);
s->GetDomain(1, &sinfo.v1, &sinfo.v2);
sinfo.u_lower_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 0, 0);
- sinfo.u_upper_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 1, 0);
+ sinfo.u_mid_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 1, 0);
+ sinfo.u_upper_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 2, 0);
sinfo.v_lower_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 0, 1);
- sinfo.v_upper_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 1, 1);
- if (!NEAR_EQUAL(sinfo.u_lower_3dlen, sinfo.u_upper_3dlen, 0.001)) {
+ sinfo.v_mid_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 1, 1);
+ sinfo.v_upper_3dlen = _cdt_get_uv_edge_3d_len(&sinfo, 2, 1);
+ if (!NEAR_EQUAL(sinfo.u_lower_3dlen, sinfo.u_mid_3dlen, 0.001) ||
+ !NEAR_EQUAL(sinfo.u_upper_3dlen, sinfo.u_mid_3dlen, 0.001)
+ ) {
+ bu_log("face %d:\n", face.m_face_index);
bu_log("u_lower_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 0, 0));
- bu_log("u_upper_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 1, 0));
+ bu_log("u_mid_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 1, 0));
+ bu_log("u_upper_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 2, 0));
+ print_debug = 1;
}
- if (!NEAR_EQUAL(sinfo.v_lower_3dlen, sinfo.v_upper_3dlen, 0.001)) {
+ if (!NEAR_EQUAL(sinfo.v_lower_3dlen, sinfo.v_mid_3dlen, 0.001) ||
+ !NEAR_EQUAL(sinfo.v_upper_3dlen, sinfo.v_mid_3dlen, 0.001)
+ ) {
+ bu_log("face %d:\n", face.m_face_index);
bu_log("v_lower_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 0, 1));
- bu_log("v_upper_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 1, 1));
+ bu_log("v_mid_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 1, 1));
+ bu_log("v_upper_3dlen: %f\n",_cdt_get_uv_edge_3d_len(&sinfo, 2, 1));
+ print_debug = 1;
}
+ if (face.m_face_index == 294) {
+ bu_log("starting face 294\n");
+ }
// may be a smaller trimmed subset of surface so worth getting
// face boundary
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