//----------------------------------------------------------------------------- void mglCanvas::glyph_wpix(long i, long j, const mglMatrix *M, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d) { if(!g.line || g.nl<=0) return; long il=0; mglPnt q0=pp, q1=pp; q0.u=q0.v=q1.u=q1.v=NAN; mglPoint p1,p2; for(long ik=0;ik<g.nl;ik++) { long ii = 2*ik; if(g.line[ii]==0x3fff && g.line[ii+1]==0x3fff) // line breakthrough { il = ik+1; continue; } else if(ik==g.nl-1 || (g.line[ii+2]==0x3fff && g.line[ii+3]==0x3fff)) { // enclose the circle. May be in future this block should be commented p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); ii=2*il; p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); } else { // normal line p1.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); ii+=2; p2.Set(f*g.line[ii]+pp.u,f*g.line[ii+1]+pp.v,0); } PostScale(M,p1); PostScale(M,p2); q0.x = p1.x; q0.y = p1.y; q0.z = p1.z; q1.x = p2.x; q1.y = p2.y; q1.z = p2.z; line_pix(i,j,q0,q1,d); } }
//----------------------------------------------------------------------------- // Optimal axis position //----------------------------------------------------------------------------- mreal mglCanvas::FindOptOrg(char dir, int ind) const { static mglPoint px, py, pz; static mglMatrix bb; mglPoint nn[8]={mglPoint(0,0,0), mglPoint(0,0,1), mglPoint(0,1,0,0), mglPoint(0,1,1), mglPoint(1,0,0), mglPoint(1,0,1), mglPoint(1,1,0), mglPoint(1,1,1)}, pp[8]; memcpy(pp, nn, 8*sizeof(mglPoint)); // do nothing if transformation matrix is the same if(B!=bb) { bb = B; for(long i=0;i<8;i++) PostScale(&B,pp[i]); // find point with minimal y long j=0; for(long i=1;i<8;i++) if(pp[i].y<pp[j].y) j=i; pp[0]=pp[j]; // first select 3 closest points pp[1].x=1-nn[j].x; pp[1].y=nn[j].y; pp[1].z=nn[j].z; PostScale(&B,pp[1]); pp[1]-=pp[0]; pp[2].x=nn[j].x; pp[2].y=1-nn[j].y; pp[2].z=nn[j].z; PostScale(&B,pp[2]); pp[2]-=pp[0]; pp[3].x=nn[j].x; pp[3].y=nn[j].y; pp[3].z=1-nn[j].z; PostScale(&B,pp[3]); pp[3]-=pp[0]; // find cosine of axis projection register mreal tx=fabs(pp[1].x/pp[1].y), ty=fabs(pp[2].x/pp[2].y), tz=fabs(pp[3].x/pp[3].y); px=py=pz=nn[j]; if(tz==0 && (ty==0 || tx==0)) // (x- & z-) or (y- & z-) axis are vertical { if(pp[1].x>pp[2].x) pz.y=1-pz.y; else pz.x=1-pz.x; } else if(tx==0 && ty==0) // x- && y-axis is vertical { py.x=1-py.x; if(pp[1].x>pp[3].x) { px.z=1-px.z; py.z=1-py.z; } } else if(tz<tx && tz<ty) // z-axis is vertical { if(pp[1].x>pp[2].x) pz.y=1-pz.y; else pz.x=1-pz.x; } else if(ty<tx && ty<tz) // y-axis is vertical { if(pp[1].x>pp[3].x) py.z=1-py.z; else py.x=1-py.x; } else if(tx<ty && tx<tz) // x-axis is vertical { if(pp[3].x>pp[2].x) px.y=1-px.y; else px.z=1-px.z; } } // return to normal variables mglPoint rx = Min+(Max-Min)/px; mglPoint ry = Min+(Max-Min)/py; mglPoint rz = Min+(Max-Min)/pz; mreal res = rx.val(ind); if(dir=='y') res = ry.val(ind); if(dir=='z') res = rz.val(ind); return res; }
//----------------------------------------------------------------------------- void mglCanvas::glyph_fpix(long i, long j, const mglMatrix *M, const mglPnt &pp, mreal f, const mglGlyph &g, const mglDrawReg *d) { if(!g.trig || g.nt<=0) return; mglPnt q0=pp, q1=pp, q2=pp; q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=NAN; for(long ik=0;ik<g.nt;ik++) { long ii = 6*ik; mglPoint p; p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0); PostScale(M,p); q0.x = p.x; q0.y = p.y; q0.z = p.z; ii+=2; p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0); PostScale(M,p); q1.x = p.x; q1.y = p.y; q1.z = p.z; ii+=2; p.Set(f*g.trig[ii]+pp.u,f*g.trig[ii+1]+pp.v,0); PostScale(M,p); q2.x = p.x; q2.y = p.y; q2.z = p.z; trig_pix(i,j,q0,q1,q2,false,d); } }
//----------------------------------------------------------------------------- void mglCanvas::glyph_lpix(long i, long j, const mglMatrix *M, const mglPnt &pp, mreal f, bool solid, const mglDrawReg *d) { mglPnt q0=pp,q1=pp,q2=pp,q3=pp; q0.u=q0.v=q1.u=q1.v=q2.u=q2.v=q3.u=q3.v=NAN; mglPoint p1,p2,p3,p4; mreal dy = 0.004; p1.Set(pp.u,pp.v-dy,0); PostScale(M,p1); p2.Set(pp.u,pp.v+dy,0); PostScale(M,p2); p3.Set(fabs(f)+pp.u,pp.v+dy,0); PostScale(M,p3); p4.Set(fabs(f)+pp.u,pp.v-dy,0); PostScale(M,p4); q0.x = p1.x; q0.y = p1.y; q0.z = p1.z; q1.x = p2.x; q1.y = p2.y; q1.z = p2.z; q2.x = p3.x; q2.y = p3.y; q2.z = p3.z; q3.x = p4.x; q3.y = p4.y; q3.z = p4.z; if(solid) quad_pix(i,j,q0,q1,q3,q2,d); else { line_pix(i,j,q0,q1,d); line_pix(i,j,q2,q1,d); line_pix(i,j,q0,q3,d); line_pix(i,j,q2,q3,d); } }