Fix stupidity in the triangle simplification; I didn't handle the

case where you bolt a triangle onto a convex poly, and both
remaining edges of the tri are coincident with the neighbours from
the poly. That was a big source of zero-area triangles.

And tweak some colors a bit.

[git-p4: depot-paths = "//depot/solvespace/": change = 1758]
This commit is contained in:
Jonathan Westhues 2008-05-29 23:32:30 -08:00
parent 69eb2273ac
commit eb8a43d22b
4 changed files with 16 additions and 6 deletions

View File

@ -69,7 +69,7 @@ void SMesh::Simplify(int start) {
for(i = start; i < l.n; i++) { for(i = start; i < l.n; i++) {
STriangle *tr = &(l.elem[i]); STriangle *tr = &(l.elem[i]);
if((tr->Normal()).Magnitude() < LENGTH_EPS*LENGTH_EPS) { if((tr->Normal()).Magnitude() < LENGTH_EPS*LENGTH_EPS) {
tr->tag = 1; tr->tag = 0;
} else { } else {
tr->tag = 0; tr->tag = 0;
} }
@ -129,7 +129,13 @@ void SMesh::Simplify(int start) {
bDot /= min(ab.Magnitude(), bc.Magnitude()); bDot /= min(ab.Magnitude(), bc.Magnitude());
dDot /= min(cd.Magnitude(), de.Magnitude()); dDot /= min(cd.Magnitude(), de.Magnitude());
if(fabs(bDot) < LENGTH_EPS && dDot > 0) { if(fabs(bDot) < LENGTH_EPS && fabs(dDot) < LENGTH_EPS) {
conv[WRAP((j+1), convc)] = c;
// and remove the vertex at j, which is a dup
memmove(conv+j, conv+j+1,
(convc - j - 1)*sizeof(conv[0]));
convc--;
} else if(fabs(bDot) < LENGTH_EPS && dDot > 0) {
conv[j] = c; conv[j] = c;
} else if(fabs(dDot) < LENGTH_EPS && bDot > 0) { } else if(fabs(dDot) < LENGTH_EPS && bDot > 0) {
conv[WRAP((j+1), convc)] = c; conv[WRAP((j+1), convc)] = c;
@ -161,7 +167,7 @@ void SMesh::Simplify(int start) {
double bDot = (ab.Cross(bc)).Dot(n); double bDot = (ab.Cross(bc)).Dot(n);
bDot /= min(ab.Magnitude(), bc.Magnitude()); bDot /= min(ab.Magnitude(), bc.Magnitude());
if(bDot < 0) return; if(bDot < 0) oops();
} }
for(i = 0; i < convc - 2; i++) { for(i = 0; i < convc - 2; i++) {

View File

@ -79,7 +79,7 @@ void Group::MenuGroup(int id) {
case GraphicsWindow::MNU_GROUP_EXTRUDE: case GraphicsWindow::MNU_GROUP_EXTRUDE:
g.type = EXTRUDE; g.type = EXTRUDE;
g.opA = SS.GW.activeGroup; g.opA = SS.GW.activeGroup;
g.color = RGB(150, 150, 150); g.color = RGB(100, 100, 100);
g.wrkpl.entityB = SS.GW.ActiveWorkplane(); g.wrkpl.entityB = SS.GW.ActiveWorkplane();
g.subtype = ONE_SIDED; g.subtype = ONE_SIDED;
g.name.strcpy("extrude"); g.name.strcpy("extrude");

View File

@ -72,6 +72,10 @@ void PaintGraphics(void);
SDWORD GetMilliseconds(void); SDWORD GetMilliseconds(void);
void dbp(char *str, ...); void dbp(char *str, ...);
#define DBPTRI(tri) \
dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \
CO((tri).a), CO((tri).b), CO((tri).c))
void Error(char *str, ...); void Error(char *str, ...);
void *AllocTemporary(int n); void *AllocTemporary(int n);

View File

@ -29,7 +29,7 @@ void TextWindow::Init(void) {
modelColor[1] = RGB(100, 100, 100); modelColor[1] = RGB(100, 100, 100);
modelColor[2] = RGB( 30, 30, 30); modelColor[2] = RGB( 30, 30, 30);
modelColor[3] = RGB(150, 0, 0); modelColor[3] = RGB(150, 0, 0);
modelColor[4] = RGB( 0, 150, 0); modelColor[4] = RGB( 0, 100, 0);
modelColor[5] = RGB( 0, 80, 80); modelColor[5] = RGB( 0, 80, 80);
modelColor[6] = RGB( 0, 0, 150); modelColor[6] = RGB( 0, 0, 150);
modelColor[7] = RGB( 80, 0, 80); modelColor[7] = RGB( 80, 0, 80);