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

bttm_path | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#3406
bttm_path : function(rx,ry,rz,m,cx,cy,r,w,ptch) {
  var p,a,b,c,i,j,k,g,s;
  p = Math.PI;
  for(j=0; j<m; j++) {
    a = G.xyz_rtp([r,p/2,2*p/m*j]);
    if(rx)     a = G.xyz_rx(a,rx);
    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) {
        a = G.xyz_v_bttm(G.pths[j][0],cx,cy,ptch);
        b = G.xyz_v_bttm(G.pths[j][1],cx,cy,ptch);
        c = G.xyz_v_bttm(G.pths[j][2],cx,cy,ptch);
        Q.c.beginPath();
        Q.c.moveTo(a[0],a[1]);
        Q.c.quadraticCurveTo(b[0],b[1],c[0],c[1]);
g = Q.c.createLinearGradient(a[0],a[1],c[0],c[1]);
        k = (a[1]-c2+r/2)/(2*r);
        s = 'rgba(255,255,255,'+k+')';
        g.addColorStop(0,s);
        k = (c[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([5,2]);
        Q.c.stroke();
        if(i>0) Q.c.setLineDash([]);
      }
    }
  }
  G.pths = new Array();
}

bttm_paths | R
ry,rz: rotations of the axis of an ellipse ptch: rotation of the view
http://qindex.info/d.php?c=5252#5364
bttm_paths : function(ry,rz,m,n,cx,cy,r,w,ptch) {
  var p,a,b,c,i,j,k,g,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) {
        a = G.xyz_v_bttm(G.pths[j][0],cx,cy,ptch);
        b = G.xyz_v_bttm(G.pths[j][1],cx,cy,ptch);
        c = G.xyz_v_bttm(G.pths[j][2],cx,cy,ptch);
        Q.c.beginPath();
        Q.c.moveTo(a[0],a[1]);
        Q.c.quadraticCurveTo(b[0],b[1],c[0],c[1]);
g = Q.c.createLinearGradient(a[0],a[1],c[0],c[1]);
        k = (a[1]-c2+r/2)/(2*r);
        s = 'rgba(255,255,255,'+k+')';
        g.addColorStop(0,s);
        k = (c[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([5,2]);
        Q.c.stroke();
        if(i>0) Q.c.setLineDash([]);
      }
    }
  }
  G.pths = new Array();
}

colorize | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#3551
colorize : function(cx,cy,r,y,p,h,o,t) {
  var pi,a,w,t1,t2,i,c;
  if(!t) var t = 1;
  pi = Math.PI;
  a  = [0,0,0];
  if(!o) var o = r;
  for(k=0; k<=r; k++) {
        
        
w  = Math.round(Math.sqrt(r*r-k*k));
if(h) {
  t1 = Math.sqrt((r/2)*(r/2)-(k-r/2)*(k-r/2))/k;
  t1 = -Math.atan(t1) + pi/2;
  t2 = t1+pi;
} else {
  t1 = Math.sqrt((r/2)*(r/2)-(k-r/2)*(k-r/2))/k;
  t1 = Math.atan(t1) + pi/2;
  t2 = t1+pi;
}

i = o-w;
c = 'rgba('+G.clrs[i][0]
       +','+G.clrs[i][1]
       +','+G.clrs[i][2]+','+t;
if(k==r) G.sarc(a,cx,cy,k,24,0,t1,1,0,0,c,y,p);
else     G.sarc(a,cx,cy,k,24,0,t1,2,0,0,c,y,p);

i = o+w;
c = 'rgba('+G.clrs[i][0]
       +','+G.clrs[i][1]
       +','+G.clrs[i][2]+','+t;
if(k==r) G.sarc(a,cx,cy,k,24,t1,t2,1,0,0,c,y,p);
else     G.sarc(a,cx,cy,k,24,t1,t2,2,0,0,c,y,p);

i = o-w;
c = 'rgba('+G.clrs[i][0]
       +','+G.clrs[i][1]
       +','+G.clrs[i][2]+','+t;
if(k==r) G.sarc(a,cx,cy,k,24,t2,2*pi,1,0,0,c,y,p);
else     G.sarc(a,cx,cy,k,24,t2,2*pi,2,0,0,c,y,p);


  }
}

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,s) {
  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);
  Q.c.beginPath();
  Q.c.moveTo(l[0],l[1]);
  Q.c.quadraticCurveTo(m[0],m[1],n[0],n[1]);
  if(s) {
    k = (l[2]+r)/(2*r)*(2/5);
    if(k>1) k = 1;
    f = 'rgba('+s+','+s+','+s+','+k+')';
    k = (n[2]+r)/(2*r)*(2/5);
    if(k>1) k = 1;
    t = 'rgba('+s+','+s+','+s+','+k+')';
g = Q.c.createLinearGradient(l[0],l[1],n[0],n[1]);
    g.addColorStop(0,f);
    g.addColorStop(1,t);
    Q.c.strokeStyle = g;
  } else {
    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+')';
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_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();
}

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(cx,cy,r,arc) {
  if(G.pnts.length<3) return false;
  var a,l,i,j,k,p,q,o,t,e,d,x,y,z;
  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(i>0) {
      if(!r) {
        p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/2);
        a.push(p);
      } 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 = G.ijkl_xyz(p);
        p = G.xyz_extnd([0,0,0],p,e-d[3]);
        t = G.xyz_v_iso(p,cx,cy);
        p[3] = t[2];
        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 = G.ijkl_xyz(p);
        p = G.xyz_extnd([0,0,0],p,e-d[3]);
        t = G.xyz_v_iso(p,cx,cy);
        p[3] = t[2];
        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) {
        d = G.ijkl_p12(G.pnts[j],G.pnts[k]);
        if(d[3]>30 && false) {
          x = G.ijkl_xyz(G.pnts[j]);
          x = r-x[3];
          y = G.ijkl_xyz(G.pnts[k]);
          y = r-y[3];
if(x>0 && y>0)
     p = G.xyz_btwn(G.pnts[j],G.pnts[k],x/(x+y));
else p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/2);
          d = G.ijkl_xyz(p);
          p = G.xyz_extnd([0,0,0],p,r-d[3]);
          q = G.xyz_btwn(G.pnts[j],p,2/3);
          e = r/G.cos_p12(q,p);
          d = G.ijkl_xyz(q);
          q = G.xyz_extnd([0,0,0],q,e-d[3]);
          t = G.xyz_v_iso(q,cx,cy);
          q[3] = t[2];
          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 = G.ijkl_xyz(q);
          q = G.xyz_extnd([0,0,0],q,e-d[3]);
          t = G.xyz_v_iso(q,cx,cy);
          q[3] = t[2];
          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);
        }
      } else {
        p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/2);
        a.push(p);
      }
    }
    if(i<l) a.push(G.pnts[k]);
  }
  l = a.length;
  if(arc) {                          // open curve
    for(i=1; i<(l-4); i+=2) {
      x = i;   if(x==1) x = 0;
      y = i+1;
      z = i+2; if(z==(l-3)) z = l-2;
      G.pths.push([a[x],a[y],a[z]]);
    }
  } else {                         // closed curve
    for(i=1; i<l; i+=2) {
      x = i;
      y = i+1; if(y>=l) y = y-l;
      z = i+2; if(z>=l) z = z-l;
      G.pths.push([a[x],a[y],a[z]]);
    }
  }
  G.pnts = new Array();
}

paths | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#3562
paths : function(cx,cy,r,arc) {
  if(G.pnts.length<3) return false;
  var a,l,i,j,k,p,q,o,t,e,d,x,y,z;
  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(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 = G.ijkl_xyz(p);
        p = G.xyz_extnd([0,0,0],p,e-d[3]);
        t = G.xyz_v_iso(p,cx,cy);
        p[3] = t[2];
        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 = G.ijkl_xyz(p);
        p = G.xyz_extnd([0,0,0],p,e-d[3]);
        t = G.xyz_v_iso(p,cx,cy);
        p[3] = t[2];
        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) {
        d = G.ijkl_p12(G.pnts[j],G.pnts[k]);
        if(d[3]>30 && false) {
          x = G.ijkl_xyz(G.pnts[j]);
          x = r-x[3];
          y = G.ijkl_xyz(G.pnts[k]);
          y = r-y[3];
if(x>0 && y>0)
     p = G.xyz_btwn(G.pnts[j],G.pnts[k],x/(x+y));
else p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/2);
          d = G.ijkl_xyz(p);
          p = G.xyz_extnd([0,0,0],p,r-d[3]);
          q = G.xyz_btwn(G.pnts[j],p,2/3);
          e = r/G.cos_p12(q,p);
          d = G.ijkl_xyz(q);
          q = G.xyz_extnd([0,0,0],q,e-d[3]);
          t = G.xyz_v_iso(q,cx,cy);
          q[3] = t[2];
          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 = G.ijkl_xyz(q);
          q = G.xyz_extnd([0,0,0],q,e-d[3]);
          t = G.xyz_v_iso(q,cx,cy);
          q[3] = t[2];
          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);
        }
      } else {
        p = G.xyz_btwn(G.pnts[j],G.pnts[k],1/2);
        a.push(p);
      }
    }
    if(i<l) a.push(G.pnts[k]);
  }
  l = a.length;
  if(arc) {                          // open curve
    for(i=1; i<(l-4); i+=2) {
      x = i;   if(x==1) x = 0;
      y = i+1;
      z = i+2; if(z==(l-3)) z = l-2;
      G.pths.push([a[x],a[y],a[z]]);
    }
  } else {                         // closed curve
    for(i=1; i<l; i+=2) {
      x = i;
      y = i+1; if(y>=l) y = y-l;
      z = i+2; if(z>=l) z = z-l;
      G.pths.push([a[x],a[y],a[z]]);
    }
  }
  G.pnts = new Array();
}

poincare | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#3409
poincare : function(cx,cy,r,e) {
  var m,n,p,q,a,b,c,d,s,t,i,j,k,x,y,z;
  m = 12;
  n = 48;
  p = Math.PI;
  b = new Array();
  c = 'rgba(255,255,255,0.7)';
  d = 'rgba(255,255,255,0.3)';
  for(j=0; j<n; j++) {
    if(j<n/2) t = Math.sin(p/2/24*j)*p;
    else      t = Math.sin(p/2/24*(n-j))*p;
    for(i=0; i<=e; i++) {
      a = G.xyz_rtp([r,p/2,t/m*i]);
      a = G.xyz_rx(a,p/n*j);
      a = G.xyz_ry(a,-p/4);
      if(a[2]>0) s = 1;
      else if(a[2]<0) s = -1;
      else s = 0;
      a[2] = 0;
      if(j<=n/2) a = G.xyz_rx(a,p/n*j);
      else       a = G.xyz_rx(a,p/n*j-p);
      a = G.xyz_rx(a,-p/4);
      q = G.xyz_v_iso(a,cx,cy);
      a.push(Math.round(q[2]));
      a.push(s);
      G.add(a);
      if(i==e) {
        b.push(a);
        if(i==m) G.iso_point(a,cx,cy,1,c,0);
      }
    }
    G.paths(cx,cy,r,1);
  }
  if(e==m) {
    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,1,255);
        }
      }
    }
  }
  G.pths = new Array();
  G.pnts = b;
  G.paths(cx,cy,r,1);
  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];
        if(e==m || e==2)
             G.glome_arc(x,y,z,cx,cy,r,2);
        else G.glome_arc(x,y,z,cx,cy,r,1);
      }
    }
  }
  G.pths = new Array();
}

poincare2 | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#3414
poincare2 : function(cx,cy,r,e) {
  var m,n,p,q,a,b,c,d,s,t,i,j,k,x,y,z;
  m = 12;
  n = 48;
  p = Math.PI;
  b = new Array();
  c = 'rgba(255,255,255,0.7)';
  d = 'rgba(255,255,255,0.3)';
  for(j=0; j<n; j++) {
    if(j<=n/2) t = Math.sin(p/2/24*j)*p;
    else       t = Math.sin(p/2/24*(n-j))*p;
    for(i=0; i<=e; i++) {
      a = G.xyz_rtp([r,p/2,t/m*i]);
      a = G.xyz_rx(a,p/n*j+p);
      a = G.xyz_ry(a,-p/4);
      if(a[2]>0) s = 1;
      else if(a[2]<0) s = -1;
      else s = 0;
      a[2] = 0;
      if(j<=n/2) a = G.xyz_rx(a,p/n*j);
      else       a = G.xyz_rx(a,p/n*j-p);
      a = G.xyz_rx(a,-p/4);
      q = G.xyz_v_iso(a,cx,cy);
      a.push(Math.round(q[2]));
      a.push(s);
      G.add(a);
      if(i==e) {
        b.push(a);
        if(i==m) G.iso_point(a,cx,cy,1,c,0);
      }
    }
    G.paths(cx,cy,r,1);
  }
  if(e==m) {
    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,1,255);
        }
      }
    }
  }
  G.pths = new Array();
  G.pnts = b;
  G.paths(cx,cy,r,1);
  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];
        if(e==m || e==2)
             G.glome_arc(x,y,z,cx,cy,r,2);
        else G.glome_arc(x,y,z,cx,cy,r,1);
      }
    }
  }
  G.pths = 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();
}

spectrum1 | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#3560
spectrum1 : function(h,v,r,c) {
  var u,a,x,i,j,s;
  if(!c) var c = 'rgba(0,0,0,1.0)';
  u = (G.clrs.length-1)/10
  a = new Array();
  for(x=1; x<=r; x++) {
      i = x;
      if(i%u==0 && x!=r) s = c;
      else s = 'rgba('+G.clrs[i][0]
                  +','+G.clrs[i][1]
                  +','+G.clrs[i][2]+',1)';
      a[x-1] = s;
      i = x+r;
      if(i%u==0 && x!=r) s = c;
      else s = 'rgba('+G.clrs[i][0]
                  +','+G.clrs[i][1]
                  +','+G.clrs[i][2]+',1)';
      a[x+r] = s;
  }
  a[r] = c;
  for(j=0; j<a.length; j++) {
      Q.add(h+j,v);
      Q.add(h+j,v+24);
      Q.draw(2,a[j],'line',0,0,0,0,0);
    }
}

sphere_path | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#3407
sphere_path : function(rx,ry,rz,m,cx,cy,r,w) {
  var p,q,a,b,c,i,j,k,g,s;
  p = Math.PI;
  for(j=0; j<m; j++) {
    a = G.xyz_rtp([r,p/2,2*p/m*j]);
    if(rx)     a = G.xyz_rx(a,rx);
    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) {
        a = G.xyz_v_iso(G.pths[j][0],cx,cy);
        b = G.xyz_v_iso(G.pths[j][1],cx,cy);
        c = G.xyz_v_iso(G.pths[j][2],cx,cy);
        Q.c.beginPath();
        Q.c.moveTo(a[0],a[1]);
        Q.c.quadraticCurveTo(b[0],b[1],c[0],c[1]);
g = Q.c.createLinearGradient(a[0],a[1],c[0],c[1]);
        k = (a[2]+r)/(2*r)*(8/10);
        s = 'rgba(255,255,255,'+(k+2/10)+')';
        g.addColorStop(0,s);
        k = (c[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();
}

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 = 1;
  if(!c) var c = 255;
  var i,j,k,l,m,n,g,t,s,x,y,a,z,p,q;
  p = 2/5*r;
  q = 1/5*r;
  for(i=-r; i<=r; i++) {
    if(v=='hollow' && i==0) G.core(cx,cy,q);
    for(j=0; j<G.pths.length; j++) {
      if(G.pths[j][1][3]==i) {
        if(v=='top') {
          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);
        } else if(v=='sphere' || v=='glome') {
          a = G.pths[j][0];
          z = a[0]*a[0]+a[1]*a[1]+a[2]*a[2];
          z = Math.sqrt(r*r-z);
          l = G.xyz_v_iso(a,cx,cy);
          l[3] = Math.round(z);
          a = G.pths[j][1];
          z = a[0]*a[0]+a[1]*a[1]+a[2]*a[2];
          z = Math.sqrt(r*r-z);
          m = G.xyz_v_iso(a,cx,cy);
          m[3] = Math.round(z);
          a = G.pths[j][2];
          z = a[0]*a[0]+a[1]*a[1]+a[2]*a[2];
          z = Math.sqrt(r*r-z);
          n = G.xyz_v_iso(a,cx,cy);
          n[3] = Math.round(z);
        } else if(v=='hollow') {
          a = G.pths[j][0];
          z = a[0]*a[0]+a[1]*a[1]+a[2]*a[2];
          z = Math.sqrt(z)-3/5*r;
          z = Math.sqrt(p*p-z*z);
          l = G.xyz_v_iso(a,cx,cy);
          l[3] = Math.round(z);
          a = G.pths[j][1];
          z = a[0]*a[0]+a[1]*a[1]+a[2]*a[2];
          z = Math.sqrt(z)-3/5*r;
          z = Math.sqrt(p*p-z*z);
          m = G.xyz_v_iso(a,cx,cy);
          m[3] = Math.round(z);
          a = G.pths[j][2];
          z = a[0]*a[0]+a[1]*a[1]+a[2]*a[2];
          z = Math.sqrt(z)-3/5*r;
          z = Math.sqrt(p*p-z*z);
          n = G.xyz_v_iso(a,cx,cy);
          n[3] = Math.round(z);
        }
        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]);
        if(v=='top') {
          k = Math.round(l[2]);
          k = k+r;
          x = 'rgba('+G.clrs[k][0]
                 +','+G.clrs[k][1]
                 +','+G.clrs[k][2]
                 +',1)';
          k = Math.round(n[2]);
          k = k+r;
          y = 'rgba('+G.clrs[k][0]
                 +','+G.clrs[k][1]
                 +','+G.clrs[k][2]
                 +',1)';
          g.addColorStop(0,x);
          g.addColorStop(1,y);
        } else if(v=='sphere') {
          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)+')');
        } else if(v=='glome') {
          k = l[3];
          if(m[4]==-1) k = -k;
          t = (l[2]+r)/(2*r)*(8/10);
          x = 'rgba('+G.clrs[k][0]
                 +','+G.clrs[k][1]
                 +','+G.clrs[k][2]
                 +','+t+')';
          k = n[3];
          if(m[4]==-1) k = -k;
          t = (n[2]+r)/(2*r)*(8/10);
          y = 'rgba('+G.clrs[k][0]
                 +','+G.clrs[k][1]
                 +','+G.clrs[k][2]
                 +','+t+')';
          g.addColorStop(0,x);
          g.addColorStop(1,y);
        } else if(v=='hollow') {
          k = l[3];
          if(m[4]==-1) k = -k;
          k = Math.round(k+r);
if(!k || k<0 || k>=G.clrs.length) continue;
          t = (l[2]+r)/(2*r)*(8/10);
          x = 'rgba('+G.clrs[k][0]
                 +','+G.clrs[k][1]
                 +','+G.clrs[k][2]
                 +','+t+')';
          k = n[3];
          if(m[4]==-1) k = -k;
          k = Math.round(k+r);
if(!k || k<0 || k>=G.clrs.length) continue;
          t = (n[2]+r)/(2*r)*(8/10);
          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_p123r | R
2018-09-30 00:05
http://qindex.info/d.php?c=5252#5374
// rotate P3 about a line connecting P1 and P2
xyz_p123r : function(p1,p2,p3,r) {
  var a,b;
  a = G.xyz_p12_d(p1,p2);
  a = G.rtp_xyz(a);
  b = G.xyz_p12_d(p1,p3);
  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]);
  b = G.xyz_p12_s(p1,b);
  return b;
}

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.782 sec, load: sec http://qindex.info/d.php?c=5252 [ refresh ] [ Email to webproger ]
Qindex.info 2004,   Introduction | 소개 | 介绍 | 導入 | qindex.info@gmail.com