Ver Mensaje Individual
  #3 (permalink)  
Antiguo 04/01/2007, 18:24
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años, 3 meses
Puntos: 45
Re: Dibujar óptimamente (Librería gráfica óptima)

Fin: parte (2/2)

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/) return true;
    
//miramos a ver si existen lados horizontales y verticales, y entre que vertices
        
var hayVert=false;
        if( 
v1.x==v2.xhayVert="v1,v2";
        else if(
v1.x==v3.xhayVert="v1,v3";
        else if(
v2.x==v3.xhayVert="v2,v3";
        var 
hayHoriz=false;
        if( 
v1.y==v2.yhayHoriz="v1,v2";
        else if(
v1.y==v3.yhayHoriz="v1,v3";
        else if(
v2.y==v3.yhayHoriz="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 == ) var noventa=v1;
                else if( 
hayHorizHayVert.split("v2").length == ) var noventa=v2;
                else if( 
hayHorizHayVert.split("v3").length == ) var noventa=v3;
            
// ahora hay que saber si noventa es el mas alto o el mas a la izq
                
if(minX==noventa.&& minY==noventa.y)    var tipo=4;
                else if(
maxX==noventa.&& maxY==noventa.y) var tipo=1;
                else if(
minX==noventa.&& maxY==noventa.y) var tipo=2;
                else if(
maxX==noventa.&& 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.&& maxY==v3.y) || (maxY==v1.&& minY==v3.y)) { var intermedioY=v2; var noIntermedioY=[v1,v3]; }
        else if((
minY==v2.&& maxY==v3.y) || (maxY==v2.&& minY==v3.y)) { var intermedioY=v1; var noIntermedioY=[v2,v3]; }
        else if((
minY==v1.&& maxY==v2.y) || (maxY==v1.&& minY==v2.y)) { var intermedioY=v3; var noIntermedioY=[v1,v2]; }
        if((
minX==v1.&& maxX==v3.x) || (maxX==v1.&& minX==v3.x)) { var intermedioX=v2; var noIntermedioX=[v1,v3]; }
        else if((
minX==v2.&& maxX==v3.x) || (maxX==v2.&& minX==v3.x)) { var intermedioX=v1; var noIntermedioX=[v2,v3]; }
        else if((
minX==v1.&& maxX==v2.x) || (maxX==v1.&& minX==v2.x)) { var intermedioX=v3; var noIntermedioX=[v1,v2]; }
        var 
noIntermedio=noIntermedioY.intersect(noIntermedioXcompararV);
        
//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.i_r_r(intermedioYv(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.&& maxX==v3.x) || (maxX==v1.&& minX==v3.x)) { var intermedioX=v2; var noIntermedioX=[v1,v3]; }
            else if((
minX==v2.&& maxX==v3.x) || (maxX==v2.&& minX==v3.x)) { var intermedioX=v1; var noIntermedioX=[v2,v3]; }
            else if((
minX==v1.&& maxX==v2.x) || (maxX==v1.&& 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_rintermedioXv(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.&& maxY==v3.y) || (maxY==v1.&& minY==v3.y)) { var intermedioY=v2; var noIntermedioY=[v1,v3]; }
        else if((
minY==v2.&& maxY==v3.y) || (maxY==v2.&& minY==v3.y)) { var intermedioY=v1; var noIntermedioY=[v2,v3]; }
        else if((
minY==v1.&& maxY==v2.y) || (maxY==v1.&& 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_rintermedioYv(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> 
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.