// Bezier patch By Maritus Watz: // http://www.openprocessing.org/sketch/57709 // Normal calculation added by Andres Colubri // Direct port of sample code by Paul Bourke. // Original code: http://paulbourke.net/geometry/bezier/ int ni=4, nj=5, RESI=ni*10, RESJ=nj*10; PVector outp[][], inp[][]; PVector normp[][]; boolean autoNormals = false; void setup() { size(1024, 768, P3D); build(); } void draw() { background(255); translate(width/2,height/2); lights(); scale(0.9); rotateY(map(mouseX,0,width,-PI,PI)); rotateX(map(mouseY,0,height,-PI,PI)); noStroke(); fill(255); for(int i=0; i= 1) { blend *= nn; nn--; if (kn > 1) { blend /= (double)kn; kn--; } if (nkn > 1) { blend /= (double)nkn; nkn--; } } if (k > 0) blend *= Math.pow(mu, (double)k); if (n-k > 0) blend *= Math.pow(1-mu, (double)(n-k)); return(blend); } double DBezierBlend(int k, double mu, int n) { int nn, kn, nkn; double dblendf = 1; nn = n; kn = k; nkn = n - k; while (nn >= 1) { dblendf *= nn; nn--; if (kn > 1) { dblendf /= (double)kn; kn--; } if (nkn > 1) { dblendf /= (double)nkn; nkn--; } } double fk = 1; double dk = 0; double fnk = 1; double dnk = 0; if (k > 0) { fk = Math.pow(mu, (double)k); dk = k*Math.pow(mu, (double)k-1); } if (n-k > 0) { fnk = Math.pow(1-mu, (double)(n-k)); dnk = (k-n)*Math.pow(1-mu, (double)(n-k-1)); } dblendf *= (dk * fnk + fk * dnk); return(dblendf); }