ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/face.c
(Generate patch)

Comparing ray/src/common/face.c (file contents):
Revision 2.13 by greg, Fri Sep 16 15:09:21 2016 UTC vs.
Revision 2.17 by greg, Sun Aug 18 00:06:10 2024 UTC

# Line 57 | Line 57 | getface(                               /* get arguments for a face */
57          f->va = o->oargs.farg;
58          f->nv = o->oargs.nfargs / 3;
59                                                  /* check for last==first */
60 <        if (dist2(VERTEX(f,0),VERTEX(f,f->nv-1)) <= FTINY*FTINY)
60 >        if (f->nv > 3 && dist2(VERTEX(f,0),VERTEX(f,f->nv-1)) <= FTINY*FTINY)
61                  f->nv--;
62                                                  /* compute area and normal */
63          f->norm[0] = f->norm[1] = f->norm[2] = 0.0;
# Line 98 | Line 98 | getface(                               /* get arguments for a face */
98          if (f->nv > 3 && badvert)
99                  objerror(o, WARNING, "non-planar vertex");
100                                                  /* find axis */
101 <        f->ax = fabs(f->norm[0]) > fabs(f->norm[1]) ? 0 : 1;
101 >        f->ax = (fabs(f->norm[1]) > fabs(f->norm[0]));
102          if (fabs(f->norm[2]) > fabs(f->norm[f->ax]))
103                  f->ax = 2;
104  
# Line 140 | Line 140 | inface(                                /* determine if point is in face */
140          ncross = 0;
141                                          /* positive x axis cross test */
142          while (n--) {
143 +                if (FRELEQ(p0[yi], y) && FRELEQ(p1[yi], y) &&
144 +                                (p0[xi] > x) ^ (p1[xi] > x))
145 +                        return(1);                      /* edge case #1 */
146                  if ((p0[yi] > y) ^ (p1[yi] > y)) {
147                          tst = (p0[xi] > x) + (p1[xi] > x);
148                          if (tst == 2)
149                                  ncross++;
150 <                        else if (tst)
151 <                                ncross += (p1[yi] > p0[yi]) ^
152 <                                                ((p0[yi]-y)*(p1[xi]-x) >
153 <                                                (p0[xi]-x)*(p1[yi]-y));
150 >                        else if (tst) {
151 >                                double  prodA = (p0[yi]-y)*(p1[xi]-x);
152 >                                double  prodB = (p0[xi]-x)*(p1[yi]-y);
153 >                                if (FRELEQ(prodA, prodB))
154 >                                        return(1);      /* edge case #2 */
155 >                                ncross += (p1[yi] > p0[yi]) ^ (prodA > prodB);
156 >                        } else if (FRELEQ(p0[xi], x) && FRELEQ(p1[xi], x))
157 >                                return(1);              /* edge case #3 */
158                  }
159                  p0 = p1;
160                  p1 += 3;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines