+
+ /* Fill the segment lists. */
+
+ if(sp->view.depth) /* perspective view has special points */
+ if(b==0){ /* point of view */
+ sp->centre.x=X(0, b);
+ sp->centre.y=Y(0, b);
+ sp->centre.z=Z(0, b);
+ }else if(b==1){ /* neighbour: used to compute local axes */
+ double x[3], p[3], x2=0, xp=0;
+ int j;
+
+ /* forward */
+ x[0] = X(0, 0) - X(1, 0);
+ x[1] = Y(0, 0) - Y(1, 0);
+ x[2] = Z(0, 0) - Z(1, 0);
+
+ /* neighbour */
+ p[0] = X(0, 1) - X(1, 0);
+ p[1] = Y(0, 1) - Y(1, 0);
+ p[2] = Z(0, 1) - Z(1, 0);
+
+ for(i=0; i<3; i++){
+ x2+= x[i]*x[i]; /* X . X */
+ xp+= x[i]*p[i]; /* X . P */
+ M[0][i] = x[i]; /* X */
+ }
+
+ for(i=0; i<3; i++) /* (X x P) x X */
+ M[1][i] = x2*p[i] - xp*x[i]; /* == (X . X) P - (X . P) X */
+
+ M[2][0] = x[1]*p[2] - x[2]*p[1]; /* X x P */
+ M[2][1] = -x[0]*p[2] + x[2]*p[0];
+ M[2][2] = x[0]*p[1] - x[1]*p[0];
+
+ /* normalise axes */
+ for(j=0; j<3; j++){
+ double A=0;
+ for(i=0; i<3; i++) A+=M[j][i]*M[j][i]; /* sum squares */
+ A=sqrt(A);
+ for(i=0; i<3; i++) M[j][i]/=A;
+ }
+
+ X(0, 1)=X(0, 0)+M[1][0]; /* adjust neighbour */
+ Y(0, 1)=Y(0, 0)+M[1][1];
+ Z(0, 1)=Z(0, 0)+M[1][2];
+
+#if 0 /* display local axes for testing */
+ X(1, b)=X(0, 0);
+ Y(1, b)=Y(0, 0);
+ Z(1, b)=Z(0, 0);
+ }else if(b==2){
+ X(0, b)=X(0, 0)+0.5*M[0][0];
+ Y(0, b)=Y(0, 0)+0.5*M[0][1];
+ Z(0, b)=Z(0, 0)+0.5*M[0][2];
+ X(1, b)=X(0, 0);
+ Y(1, b)=Y(0, 0);
+ Z(1, b)=Z(0, 0);
+ }else if(b==3){
+ X(0, b)=X(0, 0)+1.5*M[2][0];
+ Y(0, b)=Y(0, 0)+1.5*M[2][1];
+ Z(0, b)=Z(0, 0)+1.5*M[2][2];
+ X(1, b)=X(0, 0);
+ Y(1, b)=Y(0, 0);
+ Z(1, b)=Z(0, 0);
+#endif
+ }
+
+ for(i=0; i<2; i++){
+ double x=X(i,b)-sp->centre.x;
+ double y=Y(i,b)-sp->centre.y;
+ double z=Z(i,b)-sp->centre.z;
+ double X=M[0][0]*x + M[0][1]*y + M[0][2]*z;
+ double Y=M[1][0]*x + M[1][1]*y + M[1][2]*z;
+ double Z=M[2][0]*x + M[2][1]*y + M[2][2]*z+sp->view.height;
+ double absx, absy;
+ if(sp->view.depth){
+ if(X <= 0) break;
+ absx=SCALE_X(sp->view.depth*Y/X);
+ absy=SCALE_Y(sp->view.depth*Z/X);
+ if(absx < -sp->width || absx > 2*sp->width ||
+ absy < -sp->height || absy > 2*sp->height)
+ break;
+ }else{
+ absx=SCALE_X(X);
+ absy=SCALE_Y(Y);
+ }
+ if(i){
+ sp->csegs[ix].x1 = (short) absx;
+ sp->csegs[ix].y1 = (short) absy;
+ }else{
+ sp->csegs[ix].x2 = (short) absx;
+ sp->csegs[ix].y2 = (short) absy;
+ }
+ }
+ if(i == 2) /* both assigned */
+ sp->cnsegs[col]++;
+ }
+ if (sp->count) { /* erase */