webproger's home > JavaScript > G, canvas.js | 31 | T
in webproger's webmarks all the webmarks

arc | R
2018-09-17 20:10
http://qindex.info/d.php?c=5252#5260
arc : function(x,y,r,pi,ai,nf,rs,t,s,v,debug) {
// pi = [r,t,p];
// s = [wdth,rgba,arrw1,arrw2];
  var af,as,at,g,f,m,p,c;
  af = 2*Math.PI/nf;
  if(rs) as = af*rs; else as = 0
  at = 0;
  
  g  = G.xyz_rtp(pi);
  if(v=='iso')      p = G.xyz_v_iso(g,x,y);
  else if(v=='top') p = G.xyz_v_top(g,x,y);
  g[3] = p[2];
  Q.add(p[0],p[1]);
  Q.point(p[0],p[1],s[1]);
  
  /*
  if(g[0]==0 && g[1]==0) c = [-r,-r,0];
  else {
    c = G.xyz_op12([0,0,r],g);
    c = G.xyz_op12(g,c);
  }
  c = G.ijkl_xyz(c,200);
  window.alert(c);
  p = G.xyz_v_iso(c,x,y);
  Q.point(p[0],p[1],'rgba(0,0,255)');
  */
  c = new Array();
  c[0] = pi[0];
  c[1] = Math.abs(Math.PI/2-pi[1]);
  c[2] = pi[2]+Math.PI;
  if(c[2]>2*Math.PI) c[2] = c[2]-2*Math.PI;
  c = G.xyz_rtp(c);
  c = G.ijkl_xyz(c,200);
  p = G.xyz_v_iso(c,x,y);
  Q.point(p[0],p[1],'rgba(0,0,255,1)');
  
  f = G.xyz_p12r(c,g,af); at += af;
  f = G.xyz_p12r(g,f,ai+as);
  if(v=='iso')      p = G.xyz_v_iso(f,x,y);
  else if(v=='top') p = G.xyz_v_top(f,x,y);
  if(p[2]==0) f[3] = g[3]; else f[3] = p[2];
  Q.add(p[0],p[1]);
  Q.point(p[0],p[1],'rgba(0,0,255,1)');
  
  while(at<=(t-af)) {
    c = G.xyz_op12(g,f);
    m = G.xyz_p12r(c,f,af); at += af;
    m = G.xyz_p12r(f,m,as);
    if(v=='iso')      p = G.xyz_v_iso(m,x,y);
    else if(v=='top') p = G.xyz_v_top(m,x,y);
    if(p[2]==0) m[3] = f[3]; else m[3] = p[2];
    Q.add(p[0],p[1]);
    if(debug) Q.point(p[0],p[1],s[1]);
    g = f;
    f = m;
    
    if(g[3]*f[3]<0 && at<=(t-af)) {
      if(g[3]>0) 
        Q.draw(s[0],s[1],'curve',0,0,0,0);
      else
        Q.draw(s[0],s[1],'curve',0,0,5,2);
      if(v=='iso')      p = G.xyz_v_iso(f,x,y);
      else if(v=='top') p = G.xyz_v_top(f,x,y);
      Q.add(p[0],p[1]);
      c = G.xyz_op12(g,f);
      m = G.xyz_p12r(c,f,af); at += af;
      m = G.xyz_p12r(f,m,as);
      if(v=='iso')      p = G.xyz_v_iso(m,x,y);
      else if(v=='top') p = G.xyz_v_top(m,x,y);
      if(p[2]==0) m[3] = f[3]; else m[3] = p[2];
      Q.add(p[0],p[1]);
      if(debug) Q.point(p[0],p[1],s[1]);
      g = f;
      f = m;
    }
  }
  if(g[3]>0)
    Q.draw(s[0],s[1],'curve',s[2],s[3],0,0);
  else
    Q.draw(s[0],s[1],'curve',s[2],s[3],5,2);
}

bttm_paths | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5364
bttm_paths : function(ry,rz,m,n,cx,cy,r,w,ptch) {
  var p,q,a,b,i,j,k,l,x,y,z,l,m,n,s;
  p = Math.PI;
  for(i=0; i<n; i++) {
    for(j=0; j<m; j++) {
      a = G.xyz_rtp([r,p/2,2*p/m*j]);
      if(i) a = G.xyz_rx(a,p/n*i);
      if(ry-p/2) a = G.xyz_ry(a,ry-p/2);
      if(rz) a = G.xyz_rz(a,rz);
      a[0] = Math.round(a[0]);
      a[1] = Math.round(a[1]);
      a[2] = Math.round(a[2]);
      G.add(a);
    }
    G.paths();
  }
  for(i=r; i>=-r; i--) {
    for(j=0; j<G.pths.length; j++) {
      if(G.pths[j][1][2]==i) {
        l = G.xyz_v_bttm(G.pths[j][0],cx,cy,ptch);
        m = G.xyz_v_bttm(G.pths[j][1],cx,cy,ptch);
        n = G.xyz_v_bttm(G.pths[j][2],cx,cy,ptch);
        Q.c.beginPath();
        Q.c.moveTo(l[0],l[1]);
        Q.c.quadraticCurveTo(m[0],m[1],n[0],n[1]);
g = Q.c.createLinearGradient(l[0],l[1],n[0],n[1]);
        k = (l[1]-c2+r/2)/(2*r);
        s = 'rgba(255,255,255,'+k+')';
        g.addColorStop(0,s);
        k = (n[1]-c2+r/2)/(2*r);
        s = 'rgba(255,255,255,'+k+')';
        g.addColorStop(1,s);
        Q.c.strokeStyle = g;
        Q.c.lineWidth = w;
        if(i>0) Q.c.setLineDash([2,5]);
        Q.c.stroke();
        if(i>0) Q.c.setLineDash([]);
      }
    }
  }
  G.pths = new Array();
}

d2_ellipse | R
2018-09-17 20:10
http://qindex.info/d.php?c=5252#5369
// s = [wdth,rgba,dsh1,dsh2];
d2_ellipse : function(a,b,cx,cy,n,s,f,t) {
  if(!s) var s = [1,'rgba(0,0,0,1)',0,0];
  if(!f) var f = 0;
  if(!t) var t = 2*Math.PI;
  var x,y,z,p,i,j;
  if(f!=0 || t!=2*Math.PI) {
    x = a*Math.cos(f);
    y = b*Math.sin(f);
    p = G.d2_xy([x,y],cx,cy);
    Q.add(p[0],p[1]);
  }
  for(i=-n; i<n; i++) {
    j = 2*Math.PI/n*i;
    x = a*Math.cos(j);
    y = b*Math.sin(j);
    if(j>=f && j<t) {
      if(f!=0 || t!=2*Math.PI) {
        p = G.d2_xy([x,y],cx,cy);
        Q.add(p[0],p[1]);
      } else {
        G.add([x,y]);
      }
    }
  }
  if(f!=0 || t!=2*Math.PI) {
    x = a*Math.cos(t);
    y = b*Math.sin(t);
    p = G.d2_xy([x,y],cx,cy);
    Q.add(p[0],p[1]);
  }
  if(f!=0 || t!=2*Math.PI) {
    Q.draw(s[0],s[1],'curve',0,0,0,0,0);
  } else {
    G.paths();
    for(i=0; i<G.pths.length; i++) {
      x = G.d2_xy(G.pths[i][0],cx,cy);
      y = G.d2_xy(G.pths[i][1],cx,cy);
      z = G.d2_xy(G.pths[i][2],cx,cy);
      Q.c.beginPath();
      Q.c.moveTo(x[0],x[1]);
      Q.c.quadraticCurveTo(y[0],y[1],z[0],z[1]);
      Q.c.lineWidth = s[0];
      Q.c.strokeStyle = s[1];
      Q.c.stroke();
    }
    G.pths = new Array();
  }
}

glome_arc | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5341
// a = [x,y,z];
glome_arc : function(a,b,c,cx,cy,r,w) {
  var i,j,k,f,t,l,m,n,g;
  l = G.xyz_v_iso(a,cx,cy);
  m = G.xyz_v_iso(b,cx,cy);
  n = G.xyz_v_iso(c,cx,cy);
  i = Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
  i = Math.round(i);
  if(i>r) i = r;
  if(b[4]>0) i = 2*r-i;
  k = (l[2]+r)/(2*r);
  if(k>1) k = 1;
  f = 'rgba('+G.clrs[i][0]
         +','+G.clrs[i][1]
         +','+G.clrs[i][2]
         +','+k+')';
  j = Math.sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2]);
  j = Math.round(j);
  if(j>r) j = r;
  if(b[4]>0) j = 2*r-j;
  k = (n[2]+r)/(2*r);
  if(k>1) k = 1;
  t = 'rgba('+G.clrs[j][0]
         +','+G.clrs[j][1]
         +','+G.clrs[j][2]
         +','+k+')';
  Q.c.beginPath();
  Q.c.moveTo(l[0],l[1]);
  Q.c.quadraticCurveTo(m[0],m[1],n[0],n[1]);
g = Q.c.createLinearGradient(l[0],l[1],n[0],n[1]);
  g.addColorStop(0,f);
  g.addColorStop(1,t);
  Q.c.strokeStyle = g;
  Q.c.lineWidth = w;
  Q.c.stroke();
}

glome_paths | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5342
glome_paths : function(ry,rz,m,n,cx,cy,r,w) {
  var p,q,a,s,i,j,k,l,x,y,z;
  p = Math.PI;
  l = 0;
  while(l<n) {
    i = Math.round(Math.random()*100);
    j = Math.round(Math.random()*100);
    for(k=0; k<m; k++) {
      a = G.xyz_rtp([r,p/2,2*p/m*k]);
      if(j)  a = G.xyz_rx(a,p/100*j);
      if(ry) a = G.xyz_ry(a,ry);
      if(rz) a = G.xyz_rz(a,rz);
      if(a[2]>0) s = 1; 
      else if(a[2]<0) s = -1;
      else s = 0;
      a[2] = 0;
      if(rz) a = G.xyz_rz(a,-rz);
      if(i)  a = G.xyz_rx(a,p/100*i);
      if(ry) a = G.xyz_ry(a,ry);
      if(rz) a = G.xyz_rz(a,rz);
      a[0] = Math.round(a[0]);
      a[1] = Math.round(a[1]);
      a[2] = Math.round(a[2]);
      q = G.xyz_v_iso(a,cx,cy);
      a.push(Math.round(q[2]));
      a.push(s);
      G.add(a);
    }
    G.paths();
    l++;
  }
  for(i=-r; i<=r; i++) {
    for(j=0; j<G.pths.length; j++) {
      if(G.pths[j][1][3]==i) {
        x = G.pths[j][0];
        y = G.pths[j][1];
        z = G.pths[j][2];
        G.glome_arc(x,y,z,cx,cy,r,w);
      }
    }
  }
  G.pths = new Array();
}

glome_points | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5354
glome_points : function(cx,cy,r,n,s) {
  var i,j,k,x,y,z,d,p,a,t,u,v,c,e;
  for(i=0; i<n; i++) {
    x = Math.random()*r;
    y = Math.random()*Math.PI;
    if(Math.random()>Math.sin(y)) {
      n--;
      continue;
    }
    z = Math.random()*2*Math.PI;
    p = G.xyz_rtp([x,y,z]);
    d = Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
    p = G.xyz_v_iso(p,cx,cy);
    p[0] = Math.round(p[0]);
    p[1] = Math.round(p[1]);
    p[2] = Math.round(p[2]);
    p[3] = Math.round(d);
    G.add(p);
  }
  for(i=-r; i<=r; i++) {
    for(j=0; j<G.pnts.length; j++) {
      if(G.pnts[j][2]==i) {
        a = G.pnts[j];
        x = a[0]-cx;
        y = a[1]-cy;
        d = Math.sqrt(x*x+y*y);
        if(!d) continue;
        t = (r/2)*(r/2)-(d-r/2)*(d-r/2);
        t = -Math.atan(Math.sqrt(t)/d);
        if(x) u = Math.atan(y/x);
        if(x>=0 && y>=0)           k = a[3];
        else if(x<=0 && y<=0)      k = 2*r-a[3];
        else if(x>0 && y<0 && u>t) k = a[3];
        else if(x<0 && y>0 && u<t) k = a[3];
        else                       k = 2*r-a[3];
        v = (a[2]+r)/(2*r)*(3/2);
        c = 'rgba('+G.clrs[k][0]
               +','+G.clrs[k][1]
               +','+G.clrs[k][2]
               +','+v+')';
        Q.c.beginPath();
        Q.c.arc(a[0],a[1],s,0,2*Math.PI,false);
        Q.c.fillStyle = c;
        Q.c.fill();
      }
    }
  }
  G.pnts = new Array();
}

iarc2 | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5374
iarc2 : function(k,l,v,cx,cy,r,n,s,e,t,c) {
  if(!k) var k = 0;
  if(!l) var l = 0;
  if(!v) var v = 'iso';
  if(!n) var n = 24;
  if(!s) var s = 0;
  if(!e) var e = 2*Math.PI;
  if(!t) var t = 2;
  if(!c) var c = 'rgba(128,128,128,1)';
  var d,f,a,p;
  d = r*Math.sqrt(2+2*Math.cos(2*k));
  for(i=0; i<n; i++) {
    f = 2*Math.PI/n*i;
    a = G.xyz_rtp([d/2,Math.PI/2,f]);
    a[0] = a[0]-d/2;
    a = G.xyz_ry(a,k);
    a[0] = a[0]+r;
    a = G.xyz_rx(a,l);
    if(v=='iso') p = G.xyz_v_iso(a,cx,cy);
    else         p = G.xyz_v_top(a,cx,cy);
    a[3] = p[2];
    G.add(a);
  }
  G.paths();
  G.string(v,cx,cy,r);
}

ijkl_p12 | R
direction vector from two points
http://qindex.info/d.php?c=5252#5274
ijkl_p12 : function(p1,p2) {
  var i,j,k,r;
  i = p2[0]-p1[0];
  j = p2[1]-p1[1];
  k = p2[2]-p1[2];
  r = Math.sqrt(i*i+j*j+k*k);
  if(!r) return false;
  return [i/r,j/r,k/r,r];
}

ijkl_xyz | R
direction vector from a point
http://qindex.info/d.php?c=5252#5316
ijkl_xyz : function(p) {
  var r;
  r = Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
  if(!r) return false;
  return [p[0]/r,p[1]/r,p[0]/r,r];
}

iso_line_extend | R
extend line segment
http://qindex.info/d.php?c=5252#5315
iso_line_extend : function(p1,p2,l,cx,cy,s) {
  var a,b,c;
  Q.c.beginPath();
  a = G.xyz_cxy_iso(p2,cx,cy);
  Q.add(a[0],a[1]);
  b = G.ijkl_p12(p1,p2);
  c = new Array();
  c[0] = p2[0]+l*b[0];
  c[1] = p2[1]+l*b[1];
  c[2] = p2[2]+l*b[2];
  c = G.xyz_cxy_iso(c,cx,cy);
  Q.add(c[0],c[1]);
  if(!s) s = [1,'rgba(0,0,0,1)','line',0,0,0,0];
  Q.draw(s[0],s[1],'line',s[2],s[3],s[4],s[5]);
}

iso_line_p12 | R
graph a line passing through two points
http://qindex.info/d.php?c=5252#5314
// s = [wdth,rgba,arrw1,arrw2,dsh1,dsh2];
iso_line_p12 : function(p1,p2,cx,cy,s) {
  var f,t;
  Q.c.beginPath();
  f = G.xyz_cxy_iso(p1,cx,cy);
  Q.add(f[0],f[1]);
  t = G.xyz_cxy_iso(p2,cx,cy);
  Q.add(t[0],t[1]);
  if(!s) s = [1,'rgba(0,0,0,1)','line',0,0,0,0];
  Q.draw(s[0],s[1],'line',s[2],s[3],s[4],s[5]);
}

paths | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5366
paths : function(r) {
  if(G.pnts.length<3) return false;
  var a,l,i,j,k,p,q,o,e,d;
  a = new Array();
  l = G.pnts.length;
  for(i=0; i<=l; i++) {
    j = i-1; if(i<l) k = i; else k = 0;
    if(!G.pnts[k][2]) G.pnts[k][2] = 0;
    if(i>0) {
      if(G.pnts[k][4]==0) {
        p = G.xyz_btwn(G.pnts[j],G.pnts[k],2/3);
        e = r/G.cos_p12(p,G.pnts[k]);
        d = p[0]*p[0]+p[1]*p[1]+p[2]*p[2];
        d = Math.sqrt(d);
        p = G.xyz_extnd([0,0,0],p,e-d);
        p[3] = G.pnts[j][3]; p[4] = G.pnts[j][4];
        q = G.xyz_btwn(G.pnts[j],p,1/2);
        a.push(q); a.push(p);
        if(i==l) a.push(G.pnts[k]);
      } else if(G.pnts[j][4]==0) {
        if(i==1) a.push(G.pnts[j]);
        p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/3);
        e = r/G.cos_p12(G.pnts[j],p);
        d = p[0]*p[0]+p[1]*p[1]+p[2]*p[2];
        d = Math.sqrt(d);
        p = G.xyz_extnd([0,0,0],p,e-d);
        p[3] = G.pnts[k][3]; p[4] = G.pnts[k][4];
        q = G.xyz_btwn(p,G.pnts[k],1/2);
        a.push(p); a.push(q);
      } else if(G.pnts[j][4]*G.pnts[k][4]<0) {
        p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/2);
        d = p[0]*p[0]+p[1]*p[1]+p[2]*p[2];
        d = Math.sqrt(d);
        p = G.xyz_extnd([0,0,0],p,r-d);
        q = G.xyz_btwn(G.pnts[j],p,2/3);
        e = r/G.cos_p12(q,p);
        d = q[0]*q[0]+q[1]*q[1]+q[2]*q[2];
        d = Math.sqrt(d);
        q = G.xyz_extnd([0,0,0],q,e-d);
        p[3] = G.pnts[j][3]; q[4] = G.pnts[j][4];
        o = G.xyz_btwn(G.pnts[j],q,1/2);
        a.push(o); a.push(q); a.push(p);
        q = G.xyz_btwn(p,G.pnts[k],1/3);
        e = r/G.cos_p12(p,q);
        d = q[0]*q[0]+q[1]*q[1]+q[2]*q[2];
        d = Math.sqrt(d);
        q = G.xyz_extnd([0,0,0],q,e-d);
        p[3] = G.pnts[k][3]; q[4] = G.pnts[k][4];
        o = G.xyz_btwn(q,G.pnts[k],1/2);
        a.push(q); a.push(o);
      } else {
        p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/2);
        a.push(p);
      }
    }
    if(i<l) a.push(G.pnts[k]);
  }
  for(i=1; i<(a.length-2); i+=2) {
    G.pths.push([a[i],a[i+1],a[i+2]]);
  }
  G.pths.push([a[a.length-1],a[0],a[1]]);
  G.pnts = new Array();
}

rtp_xyz | R
from cartesian to spherical
http://qindex.info/d.php?c=5252#5317
rtp_xyz : function(a) {
  var r,t,p;
  r = Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);
  if(!r) return [0,0,0];
  t = Math.acos(a[2]/r);
  if(a[0]) p = Math.atan(a[1]/a[0]);
  else if(a[1]>0) p = Math.PI/2;
  else p = 3*Math.PI/2;
  return [r,t,p];
}

section_paths | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5371
section_paths : function(cx,cy,r,d,l,m,n,t,c) {
  if(!d) var d = 5*r/6;
  if(!l) var l = 4;
  if(!m) var m = 15;
  if(!n) var n = 48;
  if(!t) var t = 1;
  if(!c) var c = 'rgba(128,128,128,1)';
  var i,j,k,f,g,h,a,s,p;
  for(i=-l; i<=l; i++) {
    for(j=0; j<=m; j++) {
      //f = Math.acos(d/r)/l*i;
      s = d+2*r*Math.random();
      if(i>0) f =  Math.acos(d/s);
      else    f = -Math.acos(d/s);
      //g = Math.PI/m*j;
      g = Math.PI*Math.random();
      for(k=0; k<n; k++) {
        h = 2*Math.PI/n*k;
        //a = G.xyz_rtp([r,Math.PI/2,h]);
        a = [r,0,0];
        a = G.xyz_rz(a,h);
        a[0] = a[0]-Math.sqrt(r*r-s*s/4);
        a[1] = a[1]+s/2;
        a = G.xyz_ry(a,g);
        a = G.xyz_rx(a,f);
        a = G.xyz_v_top(a,cx,cy);
        Q.add(a[0],a[1]);
      }
      p = [-Math.sqrt(r*r-s*s/4),s/2,0];
      p = G.xyz_ry(p,g);
      p = G.xyz_rx(p,f);
      p = G.xyz_v_top(p,cx,cy);
      Q.c.beginPath();
      Q.c.arc(p[0],p[1],2,0,2*Math.PI,false);
      Q.c.fillStyle = c;
      Q.c.fill();
      Q.draw(t,c,'region',0,0,0,0,0);
    }
  }
}

side_paths | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5365
side_paths : 
function(ry,rz,m,n,cx,cy,r,w,ptch,yaw,lft) {
  var p,q,a,b,i,j,k,l,m,n,s;
  p = Math.PI;
  for(i=0; i<n; i++) {
    for(j=0; j<m; j++) {
      a = G.xyz_rtp([r,p/2,2*p/m*j]);
      if(i) a = G.xyz_rx(a,p/n*i);
      if(ry-p/2) a = G.xyz_ry(a,ry-p/2);
      if(rz) a = G.xyz_rz(a,rz);
      q = G.xyz_rz(a,-p/4);
      a[0] = Math.round(a[0]);
      a[1] = Math.round(a[1]);
      a[2] = Math.round(a[2]);
      a[3] = Math.round(q[1]);
      G.add(a);
    }
    G.paths();
  }
  for(i=-r; i<=r; i++) {
    for(j=0; j<G.pths.length; j++) {
      if(G.pths[j][1][3]==i) {
l = G.xyz_v_side(G.pths[j][0],ry,cx,cy,ptch,yaw);
m = G.xyz_v_side(G.pths[j][1],ry,cx,cy,ptch,yaw);
n = G.xyz_v_side(G.pths[j][2],ry,cx,cy,ptch,yaw);
        Q.c.beginPath();
        Q.c.moveTo(l[0],l[1]);
        Q.c.quadraticCurveTo(m[0],m[1],n[0],n[1]);
g = Q.c.createLinearGradient(l[0],l[1],n[0],n[1]);
        Q.c.lineWidth = w;
        if(lft) {
          k = (r-(l[0]-c1))/(2*r);
          s = 'rgba(255,255,255,'+k+')';
          g.addColorStop(0,s);
          k = (r-(n[0]-c1))/(2*r);
          s = 'rgba(255,255,255,'+k+')';
          g.addColorStop(1,s);
          Q.c.strokeStyle = g;
          if(i>0) Q.c.setLineDash([5,2]);
          Q.c.stroke();
          if(i>0) Q.c.setLineDash([]);
        } else {
          k = (r+(l[0]-c1))/(2*r);
          s = 'rgba(255,255,255,'+k+')';
          g.addColorStop(0,s);
          k = (r+(n[0]-c1))/(2*r);
          s = 'rgba(255,255,255,'+k+')';
          g.addColorStop(1,s);
          Q.c.strokeStyle = g;
          if(i<0) Q.c.setLineDash([5,2]);
          Q.c.stroke();
          if(i<0) Q.c.setLineDash([]);
        }
      }
    }
  }
  G.pths = new Array();
}

sphere_paths | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5361
sphere_paths : function(ry,rz,m,n,cx,cy,r,w) {
  var p,q,a,b,i,j,k,l,x,y,z,l,m,n,s;
  p = Math.PI;
  for(i=0; i<n; i++) {
    for(j=0; j<m; j++) {
      a = G.xyz_rtp([r,p/2,2*p/m*j]);
      if(i) a = G.xyz_rx(a,p/n*i);
      if(ry-p/2) a = G.xyz_ry(a,ry-p/2);
      if(rz) a = G.xyz_rz(a,rz);
      q = G.xyz_v_iso(a,cx,cy);
      a[0] = Math.round(a[0]);
      a[1] = Math.round(a[1]);
      a[2] = Math.round(a[2]);
      a[3] = Math.round(q[2]);
      G.add(a);
    }
    G.paths();
  }
  for(i=-r; i<=r; i++) {
    for(j=0; j<G.pths.length; j++) {
      if(G.pths[j][1][3]==i) {
        l = G.xyz_v_iso(G.pths[j][0],cx,cy);
        m = G.xyz_v_iso(G.pths[j][1],cx,cy);
        n = G.xyz_v_iso(G.pths[j][2],cx,cy);
        Q.c.beginPath();
        Q.c.moveTo(l[0],l[1]);
        Q.c.quadraticCurveTo(m[0],m[1],n[0],n[1]);
g = Q.c.createLinearGradient(l[0],l[1],n[0],n[1]);
        k = (l[2]+r)/(2*r)*(8/10);
        s = 'rgba(255,255,255,'+(k+2/10)+')';
        g.addColorStop(0,s);
        k = (n[2]+r)/(2*r)*(8/10);
        s = 'rgba(255,255,255,'+(k+2/10)+')';
        g.addColorStop(1,s);
        Q.c.strokeStyle = g;
        Q.c.lineWidth = w;
        Q.c.stroke();
      }
    }
  }
  G.pths = new Array();
}

string | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5375
string : function(v,cx,cy,r,w,c) {
  if(!w) var w = 2;
  if(!c) var c = 128;
  var i,j,k,l,m,n,g,t,s,x,y;
  for(i=-r; i<=r; i++) {
    for(j=0; j<G.pths.length; j++) {
      if(G.pths[j][1][3]==i) {
       if(v=='iso') {
          l = G.xyz_v_iso(G.pths[j][0],cx,cy);
          m = G.xyz_v_iso(G.pths[j][1],cx,cy);
          n = G.xyz_v_iso(G.pths[j][2],cx,cy);
        } else {
          l = G.xyz_v_top(G.pths[j][0],cx,cy);
          m = G.xyz_v_top(G.pths[j][1],cx,cy);
          n = G.xyz_v_top(G.pths[j][2],cx,cy);
        }
        Q.c.beginPath();
        Q.c.moveTo(l[0],l[1]);
        Q.c.quadraticCurveTo(m[0],m[1],n[0],n[1]);
       if(v=='iso') {
g = Q.c.createLinearGradient(l[0],l[1],n[0],n[1]);
          s = 'rgba('+c+','+c+','+c+',';
          t = (l[2]+r)/(2*r)*(8/10);
          g.addColorStop(0,s+(t+2/10)+')');
          t = (n[2]+r)/(2*r)*(8/10);
          g.addColorStop(1,s+(t+2/10)+')');
          Q.c.strokeStyle = g;
        } else {
          t = 1;
          k = r*r-(l[0]*l[0]+l[1]*l[1]+l[2]*l[2]);
          k = Math.round(Math.sqrt(k));
          if(i>0) k = r+k; else k = r-k;
          x = 'rgba('+G.clrs[k][0]
                 +','+G.clrs[k][1]
                 +','+G.clrs[k][2]
                 +','+t+')';
          k = r*r-(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);
          k = Math.round(Math.sqrt(k));
          if(i>0) k = r+k; else k = r-k;
          y = 'rgba('+G.clrs[k][0]
                 +','+G.clrs[k][1]
                 +','+G.clrs[k][2]
                 +','+t+')';
          g.addColorStop(0,x);
          g.addColorStop(1,y);
          Q.c.strokeStyle = g;
        }
        Q.c.lineWidth = w;
        Q.c.stroke();
      }
    }
  }
  G.pths = new Array();
}

x12_a_b_c | R
Quadratic Formula, a*x^2 + b*x + c = 0
http://qindex.info/d.php?c=5252#5310
x12_a_b_c : function(a,b,c) {
  if(!a || (b*b-4*a*c)<0) return false;
  var x12 = new Array();
  x12[0] = (-b-Math.sqrt(b*b-4*a*c))/(2*a);
  x12[1] = (-b+Math.sqrt(b*b-4*a*c))/(2*a);
  return x12;
}

xy12_m_r_xy | R
slope & radius
http://qindex.info/d.php?c=5252#5311
xy12_m_r_xy : function(m,r,xy) {
  var n,a,b,c,s;
  n = xy[1]-m*xy[0];
  /*
  (x-x1)*(x-x1)+(y-y1)*(y-y1) = r*r
  (x-x1)*(x-x1)+((m*x+n)-y1)*((m*x+n)-y1) = r*r
  (m*m+1)*x*x
+ 2*(m*n-x1-m*y1)*x
+ x1*x1+n*n-2*n*y1+y1*y1-r*r
  = 0
  */
  a = m*m+1;
  b = 2*(m*n-xy[0]-m*xy[1]);
  c = xy[0]*xy[0]+n*n-2*n*xy[1]+xy[1]*xy[1]-r*r;
  s = G.x12_a_b_c(a,b,c);
  if(s) return [[s[0],m*s[0]+n],[s[1],m*s[1]+n]];
  else return false;
}

xyz_op12 | R
cross product
http://qindex.info/d.php?c=5252#5318
xyz_op12 : function(p1,p2) {
  var i,j,k;
  i = p1[1]*p2[2]-p1[2]*p2[1];
  j = p1[2]*p2[0]-p1[0]*p2[2];
  k = p1[0]*p2[1]-p1[1]*p2[0];
  return [i,j,k];
}

xyz_rtp | R
transformation from spherical to cartesian
http://qindex.info/d.php?c=5252#5313
xyz_rtp : function(rtp) {
  var r,t,p,x,y,z;
  r = rtp[0]; t = rtp[1]; p = rtp[2];
  x = r*Math.sin(t)*Math.cos(p);
  y = r*Math.sin(t)*Math.sin(p);
  z = r*Math.cos(t);
  return [x,y,z];
}

xyz_rx, xyz_ry, xyz_rz,xyz_r_p12 | R
rotations about an axis
http://qindex.info/d.php?c=5252#5297
xyz_rx : function(xyz,rx) {
  var x,y,z,l,m,n;
  x = xyz[0]; y = xyz[1]; z = xyz[2];
  l = x;
  m = Math.cos(rx)*y-Math.sin(rx)*z;
  n = Math.sin(rx)*y+Math.cos(rx)*z;
  return [l,m,n];
}
,
xyz_ry : function(xyz,ry) {
  var x,y,z,l,m,n;
  x = xyz[0]; y = xyz[1]; z = xyz[2];
  l = Math.cos(ry)*x+Math.sin(ry)*z;
  m = y;
  n = -Math.sin(ry)*x+Math.cos(ry)*z;
  return [l,m,n];
}
,
xyz_rz : function(xyz,rz) {
  var x,y,z,l,m,n;
  x = xyz[0]; y = xyz[1]; z = xyz[2];
  l = Math.cos(rz)*x-Math.sin(rz)*y;
  m = Math.sin(rz)*x+Math.cos(rz)*y;
  n = z;
  return [l,m,n];
}
,
xyz_p12r : function(p1,p2,r) {
  var a,b;
  a = G.rtp_xyz(p1);
  b = p2;
  if(a[2]!=0) b = G.xyz_rz(b,-a[2]);
  if(a[1]!=0) b = G.xyz_ry(b,-a[1]);
  if(   r!=0) b = G.xyz_rz(b,r);
  if(a[1]!=0) b = G.xyz_ry(b,a[1]);
  if(a[2]!=0) b = G.xyz_rz(b,a[2]);
  return b;
}

xyz_v_bttm | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5344
xyz_v_bttm : function(xyz,cx,cy,ptch) {
  var p,a,i,j,x,y;
  p = Math.PI;
  a = xyz;
  a[2] = 0;
  a = G.xyz_rz(a,-3*p/4);
  a = G.xyz_ry(a,-p/2);
  a = G.xyz_rz(a,ptch);
  a = G.xyz_ry(a,p/2);
  a = G.xyz_rz(a,3*p/4);
  i = Math.cos(-p/4)*a[0]-Math.sin(-p/4)*a[1];
  j = Math.sin(-p/4)*a[0]+Math.cos(-p/4)*a[1];
  return [j+cx,i+cy,xyz[2]];
}

xyz_v_iso, xyz_v_top, xyz_v_sect | R
Isimetric, top and section views
http://qindex.info/d.php?c=5252#5312
xyz_v_iso : function(xyz,cx,cy) {
  var a = xyz;
  // rotate about z-axis by 1/4 TA
  a = G.xyz_rz(a,Math.PI/4);
  // rotate about x-axis by
  a = G.xyz_rx(a,-Math.acos(Math.sqrt(2/3)));
  // rotation & transition on screen
  a = G.xyz_ry(a,Math.PI);
  return [a[0]+cx,a[2]+cy,a[1]];
}
,
xyz_v_top : function(xyz,cx,cy) {
  return [xyz[1]+cx,xyz[0]+cy,xyz[2]];
}
,
xyz_v_sect : function(xyz,cx,cy,yaw,ptch) {
  var a = [xyz[0],xyz[1],0];
  if(yaw) a = G.xyz_rz(a,yaw);
  a = G.xyz_ry(a,ptch);
  if(yaw) a = G.xyz_rz(a,-yaw);
  return [a[1]+cx,a[0]+cy,xyz[2]];
}

xyz_v_side | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5363
xyz_v_side : function(xyz,ry,cx,cy,ptch,yaw,h) {
  var p,a,x,z;
  p = Math.PI;
  xyz = G.xyz_rz(xyz,-p/4);
  a = xyz;
  a[1] = 0;
  a = G.xyz_ry(a,ry);
  a = G.xyz_rz(a,p/4+ptch);
  x =  Math.cos(yaw)*a[0]+Math.sin(yaw)*a[2];
  z = -Math.sin(yaw)*a[0]+Math.cos(yaw)*a[2];
  if(h) return [-x+cx,-z+cy,xyz[1]];
  else  return [ x+cx,-z+cy,xyz[1]];
}
execute:0.698 sec, load: sec http://qindex.info/d.php?c=5252 [ refresh ] [ Email to webproger ]
Qindex.info 2004,   Introduction | 소개 | 介绍 | 導入 | qindex.info@gmail.com