// ---------------------------------------------------------------- // // Letter-pairs analysis // © 2005 Martin Bereciartua - email (at) m-i-b.com.ar // http://www.m-i-b.com.ar/ // ---------------------------------------------------------------- // // // This source is released under the creative commons license // http://creativecommons.org/licenses/by-nc-sa/1.0/ // // Thanks to: // Ben Fry and Karsten Schmidt for inspiration // // ---------------------------------------------------------------- // // Built with Processing (Beta) v091 // ---------------------------------------------------------------- // int nro_linea = 2; int nro_espacio = 0; PFont font, font1, font2, font3, font4; String par_actual = ""; // valor actual del escaneo del texto String[] lines; // lineas del texto escaneado String[] str_ayuda; int arrastrando = -1; int pares_totales = 0; float k_total; int espacio_abajo; int espacio_arriba; int espacio_derecha; int espacio_izquierda; String layout_actual = "standard"; String visual_mode = "lineal"; int burbujas_maximas = 49; int burbujas_graficadas = 0; Ball[] balls = new Ball[0]; float grav = 1.40; // Gravedad float b = 0.85; // Rebote float f = 0.90; // Friccion color ColorLineasGrales = color(200); color ColorAcento = color(255, 102, 0); color ColorAcentoCompanion = color(255, 180, 0); int lapso_refresh = 1; // cada cuantos frames se renueva la info del listado int timer_interno = 0; boolean resorte_activado = false; boolean show_info = false; boolean llenar_burbujas = false; boolean hay_gravedad = false; boolean mostrar_ayuda = false; boolean mostrando_ayuda = false; void setup() { size(800, 600); background(255); smooth(); loop(); font = loadFont("Swiss721BT-Bold-48.vlw"); font1 = loadFont("Swiss721BT-BlackCondensed-25.vlw"); font2 = loadFont("Swiss721BT-BoldCondensed-18.vlw"); font3 = loadFont("Swiss721BT-BoldCondensed-14.vlw"); font4 = loadFont("Swiss721BT-RomanCondensed-18.vlw"); str_ayuda = loadStrings("ayuda.txt"); // texto de ayuda calcularKtotal(); lines = loadStrings("Borges.txt"); // texto a analizar layout( font1, font2, font3 ); } void draw() { if ( mostrar_ayuda ) { if ( !mostrando_ayuda ) ayuda(); mostrando_ayuda = true; } else { mostrando_ayuda = false; //análisis del texto if ( nro_linea < lines.length ) { // si estoy dentro de los limites del texto char espacio = ' '; if ( lines[nro_linea].length() > 1 ) { par_actual = lines[nro_linea].substring(nro_espacio, nro_espacio+2); if ( par_actual.charAt(0) != espacio && par_actual.charAt(1) != espacio ) sumarKP( par_actual ); } nro_espacio++; if ( nro_espacio > lines[nro_linea].length()-2 ) { nro_espacio = 0; nro_linea++; } } else par_actual = ":::"; // refrescar orden de la info timer_interno++; if ( timer_interno == lapso_refresh ) { timer_interno = 0; ordenarArrays(); } background(255); pares_totales = 0; burbujas_graficadas = 0; for ( int i=burbujas_maximas; i>=0; i-- ) { if ( i < balls.length ) { pares_totales += balls[i].ocurrencias; burbujas_graficadas++; } } calcularKtotal(); for ( int i=0; i=0; i-- ) { if ( i < balls.length ) { if ( hay_gravedad ) balls[i].fall(); if ( resorte_activado ) balls[i].spring(); balls[i].bounce(); balls[i].collide(); balls[i].move(); balls[i].encima(); balls[i].display(); } } layout( font1, font2, font3 ); } } void ayuda() { float ancho, alto, radio; ancho = 380; alto = 450; radio = 20; rectRound( espacio_izquierda+((width-espacio_izquierda-espacio_derecha)/2), espacio_arriba+((height-espacio_arriba-espacio_abajo)/2)+1, ancho, alto, radio, false, color(255, 220), true, color(0,50), 7 ); filter(BLUR, 3); rectRound( espacio_izquierda+((width-espacio_izquierda-espacio_derecha)/2), espacio_arriba+((height-espacio_arriba-espacio_abajo)/2), ancho, alto, radio, true, color(255, 240), true, color(0,60), 2 ); // cargar textos textFont(font1, 25); textAlign(LEFT); fill(120); float xt = espacio_izquierda+((width-espacio_izquierda-espacio_derecha)/2-ancho/2)+20; float yt = espacio_arriba+((height-espacio_arriba-espacio_abajo)/2-alto/2)+45; text(str_ayuda[0], xt, yt); yt += 38; xt += 8; float xt1 = xt + 20; String[] comandos; for (int i=3; i < str_ayuda.length; i++) { if ( !str_ayuda[i].equals("---") ) { comandos = split( str_ayuda[i], "|" ); fill(ColorAcento); textAlign(CENTER); textFont(font2, 18); text(comandos[0], xt, yt); fill(120); textAlign(LEFT); textFont(font4, 18); text(comandos[1], xt1, yt); } yt += 22; } xt = espacio_izquierda+((width-espacio_izquierda-espacio_derecha)/2); yt = espacio_arriba+((height-espacio_arriba-espacio_abajo)/2+alto/2)-15; textAlign(CENTER); fill(ColorAcentoCompanion); textFont(font3, 14); text(str_ayuda[1], xt, yt); } void graficando() { // funcion para graficar los top 20 float tamanio = 48; int altura = 140; int alpha_value = 255; for (int i=0; i < 20 && i < balls.length ; i++) { textFont(font, tamanio); textAlign(CENTER); fill(0, 102, 153, alpha_value); text(balls[i].nombre, width - 50, altura); tamanio = tamanio * 0.94; altura += tamanio-5; alpha_value -= 10; } } void layout( PFont font1, PFont font2, PFont font3 ) { if ( layout_actual == "standard" ) { espacio_abajo = 60; espacio_arriba = 15; espacio_derecha = 100; espacio_izquierda = 15; rectMode(CORNERS); noStroke(); fill(255); rect(width-espacio_derecha+5, 0, width, height); textFont(font, 48); textAlign(CENTER); fill(ColorAcento); text(par_actual, width - 50, 75); textFont(font3, 14); textAlign(CENTER); fill(180); text(str_ayuda[2], width - 50, height-15); graficando(); } else if ( layout_actual == "reducido" ) { espacio_abajo = 60; espacio_arriba = 20; espacio_derecha = 20; espacio_izquierda = 20; } // datos textFont(font1, 25); textAlign(LEFT); fill(120); text(str(burbujas_graficadas)+" / "+str(balls.length), espacio_izquierda, height-30); // titulos textFont(font2, 18); textAlign(RIGHT); text("]", width - espacio_derecha, height-31); fill(ColorAcento); text(lines[1], width - espacio_derecha - textWidth("]"), height-31); fill(120); text("[", width - espacio_derecha - textWidth(lines[1]+"]"), height-31); float ancho_parcial = textWidth("["+lines[1]+"]"); textFont(font2, 18); text(lines[0]+" ", width - espacio_derecha - ancho_parcial, height-31); if ( nro_linea < lines.length ) { barraAvance( espacio_izquierda, height - 25, width - espacio_derecha, height - 15, nro_linea-2, lines.length-3, ColorLineasGrales, ColorAcento ); barraAvance( espacio_izquierda, height - 15, width - espacio_derecha, height - 12, nro_espacio, lines[nro_linea].length()-2, ColorLineasGrales, ColorAcentoCompanion ); } else { barraAvance( espacio_izquierda, height - 25, width - espacio_derecha, height - 15, 10, 10, ColorLineasGrales, ColorAcento ); barraAvance( espacio_izquierda, height - 15, width - espacio_derecha, height - 12, 10, 10, ColorLineasGrales, ColorAcentoCompanion ); } } void sumarKP( String newKP ) { int kp_encontrado = 0; // buscar kp a sumar en array existente for (int i=0; i < balls.length; i++) { if ( balls[i].nombre.equals(newKP) == true ) { // si encuentro el kp le sumo una ocurrencia kp_encontrado = 1; balls[i].ocurrencias++; } if ( kp_encontrado == 1 ) break; } // si no lo encuentro lo creo if ( kp_encontrado == 0 ) nuevoKP( newKP ); } void nuevoKP( String newx ) { calcularKtotal(); float ka; if ( balls.length > 0 ) ka = k_total / balls.length; else ka = k_total; Ball[] tempBall = append( balls, ka, newx, 1 ); balls = tempBall; } void ordenarArrays() { Ball[] temp_ocurrencias = new Ball[balls.length]; System.arraycopy(balls, 0, temp_ocurrencias, 0, balls.length); Ball temp; int i, j; for (i = temp_ocurrencias.length-1; i >= 0; i--) for (j = 0; j < i; j++) if (temp_ocurrencias[j].ocurrencias < temp_ocurrencias[j + 1].ocurrencias) { temp = temp_ocurrencias[j]; temp_ocurrencias[j] = temp_ocurrencias[j + 1]; temp_ocurrencias[j + 1] = temp; } balls = temp_ocurrencias; } void calcularKtotal () { // encontrar un valor de k (superficie a ocupar) que concuerde con // la cantidad de burbujar a dibujar (evitar que se superpongan) float alto = height-espacio_arriba-espacio_abajo; float ancho = width-espacio_izquierda-espacio_derecha; if ( burbujas_graficadas <= 1 ) { if ( alto < ancho ) k_total = PI*pow(alto/2,2)*0.8; else k_total = PI*pow(ancho/2,2)*0.8; } else if ( burbujas_graficadas > 1 && burbujas_graficadas <= 6 ) k_total = ancho * alto * 0.65; else if ( burbujas_graficadas > 6 && burbujas_graficadas <= 20 ) k_total = ancho * alto * 0.75; else if ( burbujas_graficadas > 20 && burbujas_graficadas <= 50 ) k_total = ancho * alto * 0.80; else if ( burbujas_graficadas > 50 && burbujas_graficadas <= 200 ) k_total = ancho * alto * 0.86; else if ( burbujas_graficadas > 200 ) k_total = ancho * alto * 0.92; } void keyPressed() { if ( !mostrar_ayuda ) { if(keyCode<256) keyboard.press(keyCode); if (key == '+') { // viendo mas burbujas if ( burbujas_maximas == 0 ) burbujas_maximas = 4; else if ( burbujas_maximas == 4 ) burbujas_maximas = 19; else if ( burbujas_maximas == 19 ) burbujas_maximas = 49; else if ( burbujas_maximas == 49 ) burbujas_maximas = 99; else if ( burbujas_maximas == 99 ) burbujas_maximas = 199; else if ( burbujas_maximas == 199 ) burbujas_maximas = 399; else if ( burbujas_maximas == 399 ) burbujas_maximas = 4999; } if (key == '-') { // viendo menos burbujas if ( burbujas_maximas == 4999 ) burbujas_maximas = 399; else if ( burbujas_maximas == 399 ) burbujas_maximas = 199; else if ( burbujas_maximas == 199 ) burbujas_maximas = 99; else if ( burbujas_maximas == 99 ) burbujas_maximas = 49; else if ( burbujas_maximas == 49 ) burbujas_maximas = 19; else if ( burbujas_maximas == 19 ) burbujas_maximas = 4; else if ( burbujas_maximas == 4 ) burbujas_maximas = 0; } if (key == 'h' || key == 'H') { // mostrar ayuda if ( mostrar_ayuda == true ) mostrar_ayuda = false; else if ( mostrar_ayuda == false ) mostrar_ayuda = true; } if (key == 'r' || key == 'R') { // activando resortes if ( resorte_activado == true ) resorte_activado = false; else if ( resorte_activado == false ) resorte_activado = true; } if (key == 'i' || key == 'I') { // mostrar info en burbujas if ( show_info == true ) show_info = false; else if ( show_info == false ) show_info = true; } if (key == 'l' || key == 'L') { // mostrar burbujas opacas if ( llenar_burbujas == true ) llenar_burbujas = false; else if ( llenar_burbujas == false ) llenar_burbujas = true; } if (key == 'f' || key == 'F') { // cambiar modo de layout if ( layout_actual == "standard" ) layout_actual = "reducido"; else if ( layout_actual == "reducido" ) layout_actual = "standard"; } if ( keyboard.pressed(UP) || keyboard.pressed(DOWN) || keyboard.pressed(LEFT) || keyboard.pressed(RIGHT) ) { // aplicar gravedad hay_gravedad = true; } else hay_gravedad = false; if (key == 's') { // shaking for ( int i=0; i