Código PHP:
//rellena tres puntos del plano de un color
function rellenar(v1,v2,v3,col) {
//dibujamos los vertices como puntos
//pto(v1.x,v1.y,"pink"); pto(v2.x,v2.y,"pink"); pto(v3.x,v3.y,"pink");
//alert("INICIO: "+v1.x+","+v1.y+"; "+v2.x+","+v2.y+"; "+v3.x+","+v3.y);
//variables de dimension que necesitaremos
var minX,minY,maxX,maxY;
minX=Math.min(v1.x,v2.x,v3.x); maxX=Math.max(v1.x,v2.x,v3.x);
minY=Math.min(v1.y,v2.y,v3.y); maxY=Math.max(v1.y,v2.y,v3.y);
var ancho=maxX-minX; var alto=maxY-minY;
//triangulo demasiado pequeño como para esforzarse en dibujarlo (ademas fin de la recursividad)
if( ancho*alto/2 < 1 ) return true;
//miramos a ver si existen lados horizontales y verticales, y entre que vertices
var hayVert=false;
if( v1.x==v2.x) hayVert="v1,v2";
else if(v1.x==v3.x) hayVert="v1,v3";
else if(v2.x==v3.x) hayVert="v2,v3";
var hayHoriz=false;
if( v1.y==v2.y) hayHoriz="v1,v2";
else if(v1.y==v3.y) hayHoriz="v1,v3";
else if(v2.y==v3.y) hayHoriz="v2,v3";
if(hayHoriz && hayVert) { //hay horizontales y verticales a la vez --> es angulo recto
//averiguar el tipo - cual tiene el ang recto? cual esta en hayHoriz y en hayVert a la vez?
//donde esta el angulo de 90?
var hayHorizHayVert=(hayHoriz+hayVert);
if( hayHorizHayVert.split("v1").length == 3 ) var noventa=v1;
else if( hayHorizHayVert.split("v2").length == 3 ) var noventa=v2;
else if( hayHorizHayVert.split("v3").length == 3 ) var noventa=v3;
// ahora hay que saber si noventa es el mas alto o el mas a la izq
if(minX==noventa.x && minY==noventa.y) var tipo=4;
else if(maxX==noventa.x && maxY==noventa.y) var tipo=1;
else if(minX==noventa.x && maxY==noventa.y) var tipo=2;
else if(maxX==noventa.x && minY==noventa.y) var tipo=3;
return rect_triangle(tipo,minX,minY,ancho,alto,col);
}
else if(!hayHoriz && !hayVert) { //si no tiene ninguna forma en concreto
//tiramos una horiz por el punto intermedio segun las Y
if((minY==v1.y && maxY==v3.y) || (maxY==v1.y && minY==v3.y)) { var intermedioY=v2; var noIntermedioY=[v1,v3]; }
else if((minY==v2.y && maxY==v3.y) || (maxY==v2.y && minY==v3.y)) { var intermedioY=v1; var noIntermedioY=[v2,v3]; }
else if((minY==v1.y && maxY==v2.y) || (maxY==v1.y && minY==v2.y)) { var intermedioY=v3; var noIntermedioY=[v1,v2]; }
if((minX==v1.x && maxX==v3.x) || (maxX==v1.x && minX==v3.x)) { var intermedioX=v2; var noIntermedioX=[v1,v3]; }
else if((minX==v2.x && maxX==v3.x) || (maxX==v2.x && minX==v3.x)) { var intermedioX=v1; var noIntermedioX=[v2,v3]; }
else if((minX==v1.x && maxX==v2.x) || (maxX==v1.x && minX==v2.x)) { var intermedioX=v3; var noIntermedioX=[v1,v2]; }
var noIntermedio=noIntermedioY.intersect(noIntermedioX, compararV);
//alert(noIntermedioY[0].x+","+noIntermedioY[0].y+"; "+noIntermedioY[1].x+","+noIntermedioY[1].y+"\n"+noIntermedioX[0].x+","+noIntermedioX[0].y+"; "+noIntermedioX[1].x+","+noIntermedioX[1].y);
//alert(noIntermedio[0].x+","+noIntermedio[0].y);
var nuevoV=v(0,intermedioY.y);
//interseccion de las rectas horizontal por intermedioY y el lado opuesto del triangulo (los q no son intermedioY)
nuevoV.x = i_r_r(intermedioY, v(12457.78,intermedioY.y) ,noIntermedioY[0],noIntermedioY[1]).x;
//alert(nuevoV.x);
//pto(nuevoV.x,nuevoV.y,"red");
if(noIntermedio.length==2) { // intermedioX==intermedioY, luego hay dos noIntermedios
rellenar(intermedioY,nuevoV,noIntermedio[0],col);
rellenar(intermedioY,nuevoV,noIntermedio[1],col);
}
else {
rellenar(intermedioY,nuevoV,noIntermedio[0],col);
rellenar(intermedioY,nuevoV,intermedioX,col);
}
}
else if(hayHoriz) {
//hallamos el intermedio en X
if((minX==v1.x && maxX==v3.x) || (maxX==v1.x && minX==v3.x)) { var intermedioX=v2; var noIntermedioX=[v1,v3]; }
else if((minX==v2.x && maxX==v3.x) || (maxX==v2.x && minX==v3.x)) { var intermedioX=v1; var noIntermedioX=[v2,v3]; }
else if((minX==v1.x && maxX==v2.x) || (maxX==v1.x && minX==v2.x)) { var intermedioX=v3; var noIntermedioX=[v1,v2]; }
//una vertical por ahi cortara a un lado del triangulo en un punto, qdaran dos triangulos divididos
var nuevoV=v(intermedioX.x,0);
nuevoV.y=i_r_r( intermedioX, v(intermedioX.x,12.125), noIntermedioX[0], noIntermedioX[1] ).y;
//rellenamos triangulo parcial 1
rellenar(intermedioX,nuevoV,noIntermedioX[0],col);
//rellenamos triangulo parcial 2
rellenar(intermedioX,nuevoV,noIntermedioX[1],col);
}
else if(hayVert) {
//hallamos el intermedio en Y
if((minY==v1.y && maxY==v3.y) || (maxY==v1.y && minY==v3.y)) { var intermedioY=v2; var noIntermedioY=[v1,v3]; }
else if((minY==v2.y && maxY==v3.y) || (maxY==v2.y && minY==v3.y)) { var intermedioY=v1; var noIntermedioY=[v2,v3]; }
else if((minY==v1.y && maxY==v2.y) || (maxY==v1.y && minY==v2.y)) { var intermedioY=v3; var noIntermedioY=[v1,v2]; }
//una horizontal por ahi cortara a un lado del triangulo en un punto
var nuevoV=v(0,intermedioY.y);
nuevoV.x=i_r_r( intermedioY, v(22.567,intermedioY.y), noIntermedioY[0], noIntermedioY[1] ).x;
//pto(nuevoV.x,nuevoV.y,"red");
//rellenamos triangulo parcial 1
rellenar(intermedioY,nuevoV,noIntermedioY[0],col);
//rellenamos triangulo parcial 2
rellenar(intermedioY,nuevoV,noIntermedioY[1],col);
}
}
var p1=v(100,200); pto(p1.x,p1.y);
var p2=v(300,100); pto(p2.x,p2.y);
var p3=v(400,400); pto(p3.x,p3.y);
rellenar(p1,p2,p3, "orange");
var v1=v(600,200); pto(v1.x,v1.y);
var v2=v(800,100); pto(v2.x,v2.y);
var v3=v(650,90); pto(v3.x,v3.y);
rellenar(v1,v2,v3, "blue");
</script>
</body>
</html>