//----------------------------------------------------------------------------- HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm) { if(!idat || (jdat && jdat->GetNN()!=idat->GetNN()) || (kdat && kdat->GetNN()!=idat->GetNN())) return 0; const mglData *dd=dynamic_cast<const mglData *>(dat); const mglDataC *dc=dynamic_cast<const mglDataC *>(dat); long nx=dat->GetNx(), ny=dat->GetNy(), nz=dat->GetNz(); mglDataC *r=new mglDataC(idat->GetNx(),idat->GetNy(),idat->GetNz()); if(dd) #pragma omp parallel for for(long i=0;i<idat->GetNN();i++) { mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?mglSpline3st<mreal>(dd->a,nx,ny,nz, x,y,z):NAN; } else if(dc) #pragma omp parallel for for(long i=0;i<idat->GetNN();i++) { mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?mglSpline3st<dual>(dc->a,nx,ny,nz, x,y,z):NAN; } else #pragma omp parallel for for(long i=0;i<idat->GetNN();i++) { mreal x=idat->vthr(i), y=jdat?jdat->vthr(i):0, z=kdat?kdat->vthr(i):0; r->a[i] = mgl_isnum(x*y*z)?mgl_data_linear(dat, x,y,z):NAN;; } return r; }
//----------------------------------------------------------------------------- void mglCanvas::trig_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d) { if(!visible(i,j,d->m, d->PenWidth,d->angle)) return; mglPnt d1(p2-p1), d2(p3-p1); float dd = d2.x*d1.y - d1.x*d2.y; if(fabs(dd)<1e-5) return; // points lies on the same line float dyv =-d1.x/dd, dxv = d1.y/dd, dyu = d2.x/dd, dxu =-d2.y/dd; float xx = (i-p1.x), yy = (j-p1.y); float u = dxu*xx+dyu*yy, v = dxv*xx+dyv*yy; if(u<0 || v<0 || u+v>1) return; mglPnt p(p1+d1*u+d2*v); if(mgl_isnan(p.u) && mgl_isnum(p.v) && anorm) { mglPoint nr(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z)); p.u = nr.x; p.v = nr.y; p.w = nr.z; } unsigned char r[4]; if(r[3]) pnt_plot(i,j,p.z,col2int(p,r,d->ObjId),d->ObjId); }
//----------------------------------------------------------------------------- void mglCanvas::quad_pix(long i, long j, const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d) { if(!visible(i,j,d->m, d->PenWidth,d->angle)) return; mglPnt d1(p2-p1), d2(p3-p1), d3(p4+p1-p2-p3); float dd = d1.x*d2.y-d1.y*d2.x; float dsx =-4*(d2.y*d3.x - d2.x*d3.y)*d1.y; float dsy = 4*(d2.y*d3.x - d2.x*d3.y)*d1.x; float xx = (i-p1.x), yy = (j-p1.y), s; s = dsx*xx + dsy*yy + (dd+d3.y*xx-d3.x*yy)*(dd+d3.y*xx-d3.x*yy); if(s<0) return; // no solution s = sqrt(s); float qu = d3.x*yy - d3.y*xx + dd + s, u=-1; float qv = d3.y*xx - d3.x*yy + dd + s, v=-1; if(qu && qv) { u = 2.f*(d2.y*xx - d2.x*yy)/qu; v = 2.f*(d1.x*yy - d1.y*xx)/qv; } if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) // first root bad { qu = d3.x*yy - d3.y*xx + dd - s; qv = d3.y*xx - d3.x*yy + dd - s; u = v = -1.f; if(qu && qv) { u = 2.f*(d2.y*xx - d2.x*yy)/qu; v = 2.f*(d1.x*yy - d1.y*xx)/qv; } if(u*(1.f-u)<0.f || v*(1.f-v)<0.f) return; // second root bad } mglPnt p(p1+d1*u+d2*v+d3*(u*v)); if(mgl_isnan(p.u) && mgl_isnum(p.v)) { mglPoint n1(mglPoint(p2.x-p1.x,p2.y-p1.y,p2.z-p1.z)^mglPoint(p3.x-p1.x,p3.y-p1.y,p3.z-p1.z)); mglPoint n2(mglPoint(p2.x-p4.x,p2.y-p4.y,p2.z-p4.z)^mglPoint(p3.x-p4.x,p3.y-p4.y,p3.z-p4.z)); p.u = (n1.x+n2.x)*0.5; p.v = (n1.y+n2.y)*0.5; p.w = (n1.z+n2.z)*0.5; } unsigned char r[4]; col2int(p,r,d->ObjId); if(r[3]) pnt_plot(i,j,p.z,r,d->ObjId); }