package es; import java.util.*; import java.awt.*; import java.awt.image.*; public class Kernel { double dCentreX,dCentreY;//Coordenades del centre antigues double dNouCentreX = 0;//Coordenada X del centre recalculada double dNouCentreY = 0;//Coordenada Y del centre recalculada double dAngle = 0;//Angle de dibuix de la tortuga float fXactual,fYactual=0; float fMinAbsolutX,fMaxAbsolutX,fMinAbsolutY,fMaxAbsolutY=0; float fAlturaLletra;//definida també a PostProcess int iAmple,iAltura;//Dimensions de la imatge final int iFontSize;//Mida de la lletra int iNumCaractMaxOrdres = 0;//Var. de carregaBibliotecaOrdresTortuga int p, q, r, l,m = 0;//Var. de llegeix int iConrRectDib = 0; //Contador de rectes dibuixades /*Es fixa que el nombre de divisions (allí on s'escriurán les lletres) sigui 7. Per mantenir la multiplicitat de 5, es farà que per 7 divisions dins un mateix segment de recta, s'omplin només 5 espais amb lletres. El primer i últim espai es deixen en blanc. Això únicament es fa per millorar substancialment la llegibilitat del text*/ int iNombreDivisions = 7; int iNombreEspaisBuits = 2; int iFinalText = iNombreDivisions - 2; int iIniciText = 0;//Variable de control de la lletra en strbTextTabulaSmaragdina boolean bFlagDuesIgualsInici, bFlagDuesIgualsFinal = false; //boolean bFlagFileNotFound=false; String strFontType;//Tipus de la font de la lletra String strDirOutputImg;//Directòri d'output de la imatge String strMissatgeRetorn; //Definició del text a escriure: //StringBuffer strbTextTabulaSmaragdina = new StringBuffer("quodestinferiusestsicutquodestsuperiusetquodestsuperiusestsicutquodestinferiuset"); StringBuffer strbTextTabulaSmaragdina=new StringBuffer("QUODESTINFERIUSESTSICUTQUODESTSUPERIUSETQUODESTSUPERIUSESTSICUTQUODESTINFERIUSET"); //StringBuffer strbTextTabulaSmaragdina=new StringBuffer("OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"); BufferedImage bi; Graphics2D g2d; FontMetrics fm; ArrayList arrayBibliotecaOrdresTortuga = new ArrayList(); ArrayList arrayBibliotecaOp = new ArrayList(); ArrayList arrayCadenaLlegida = new ArrayList(); ArrayList arrayOrdresTortuga = new ArrayList(); //Constructor per defecte Kernel (){ } //Constructor Kernel (double dCX,double dCY,int iAlt,int iAmp,String strDir, String strFontype, int iFontsiz) { this.dCentreX=dCX; this.dCentreY=dCY; this.iAltura=iAlt; this.iAmple=iAmp; this.strDirOutputImg=strDir; this.strFontType=strFontype; this.iFontSize=iFontsiz; bi = new BufferedImage(iAmple,iAltura,BufferedImage.TYPE_BYTE_BINARY); g2d = bi.createGraphics(); g2d.setColor(Color.WHITE);//Fixa el color del background de la imatge. En aquest cas, el BLANC. g2d.fillRect(0,0,iAmple,iAltura); //Es fixa el tipus i mida de la lletra. Font f; f = new Font(strFontType, Font.PLAIN, iFontSize); g2d.setFont(f); g2d.setColor(Color.BLACK);//color lletra. En aquest cas, negre. fm=g2d.getFontMetrics(f); } /*Mètode SUBSTITUEIX: Agafa la "rewriting rule" i la inserta a la n-èssima iteració segons el caràcter que es vol que trobi*/ public String substitueix(String strRwRule,String strNiteracio,String strCaracterBuscat){ String strChunkNiteracio = "";//Cadena que conté un troç o "chunk" de la cadena resultant de la n-èssima iteració StringBuffer buffResultat = new StringBuffer();//Buffer de Strings d'output carregaBibliotecaOp(); for (int i = 0; i < strNiteracio.length(); i++) { strChunkNiteracio=strNiteracio.substring(i, i + 1); if (strCaracterBuscat.equals(strChunkNiteracio)) { buffResultat.append(strRwRule); } else { for (int j = 0; j < arrayBibliotecaOp.size(); j++) { String strComponentArrayBiblioOp=arrayBibliotecaOp.get(j).toString(); if (strChunkNiteracio.equals(strComponentArrayBiblioOp)){ buffResultat.append(strComponentArrayBiblioOp); } } } } return buffResultat.toString(); } //Mètode LLEGEIX public ArrayList llegeix(String strRwRule){ carregaBibliotecaOrdresTortuga();//Es carrega l'array d'ordres de tortuga /*Loop que examina cada ordre del RwRule, i quan en troba una reconeixible (segons la biblioteca d'operadors), la separa i guarda en una certa ubicació al arrayOrdresTortuga*/ for(p=0;pstrbTextTabulaSmaragdina.length()) { iIniciText=0; iFinalText=iNombreDivisions-2; } //Contador de rectes dibuixades iConrRectDib=iConrRectDib+1; //Canvi del punt de partida de la tortuga dCentreX=dNouCentreX; dCentreY=dNouCentreY; } //Escriu el text sobre la recta private void escriuRecta(double dX0,double dY0,double dX1,double dY1,String strTextTabulaSmaragdina,boolean bFlagDuesIgualsInici,boolean bFlagDuesIgualsFinal){ //Construcció del vector que defineix la recta double dX=dX1-dX0; double dY=dY1-dY0; //Classificació de la recta: //VU= Vertical UP (verical, en sentit cap amunt) //VD= Vertical Down (verical, en sentit cap abaix) //HR= Horitzontal Right (horitzontal, en sentit cap a la dreta) //HL= Horitzontal Left (horitzontal, en sentit cap a l'esquerra) /*Nota: s'ha de tenir en compte que el sistema de coordenades en el Panel és: 0 en la cantonada esquerra, amunt de tot. L'eix de les X es positiu des de l'origen cap a la dreta, i l'eix de les Y és positiu des de l'origen cap abaix. És a dir, la única diferència amb un sistema coordenat standard és que l'eix de les Y és positiu en sentit contràri*/ String strTipusRecta=""; if(dX==0 && dY<0) strTipusRecta="VU"; if(dX==0 && dY>0) strTipusRecta="VD"; if(dX>0 && dY==0) strTipusRecta="HR"; if(dX<0 && dY==0) strTipusRecta="HL"; float fLongRecta=(float) Math.sqrt(dX*dX+dY*dY); //Càlcul del mòdul del vector que defineix cada recta float fLongDivisioRectaBuida=fLongRecta/20; //literal arbitràri //Amplada d'una divisió normal de tots els segments de recta (allí on s'hi ubicarà cada lletra 'q','o', etc.) float fLongDivisioRecta=0; if(bFlagDuesIgualsInici==false && bFlagDuesIgualsFinal==false){ fLongDivisioRecta=(fLongRecta-2*fLongDivisioRectaBuida)/(iNombreDivisions-iNombreEspaisBuits); } else if (bFlagDuesIgualsInici==true || bFlagDuesIgualsFinal==true){ fLongDivisioRecta=(2*fLongRecta-2*fLongDivisioRectaBuida)/(2*iNombreDivisions-2*iNombreEspaisBuits); } fAlturaLletra=7;//Parmàtere arbitràri (definida també a PostProcess) int j=0; float Xlletra=0; float Ylletra=0; for(int i=0;i