|
Ideen bak generatorene på denne siden er å representere informasjonen som ligger i digitale datafiler som bilder. Fine ord men hva betyr det egentlig? De fleste kjenner til at filene som lager når en tar digitale bilder eller skriver et dokument i en tekstbehandler i bunn og grunn er en streng med 0er og 1er. For å få noe fornuftig ut av disse strengene trengs et sett med regler for hvordan de skal tolkes. Et eksempel er enkle tekstfiler hvor hver bokstav har hver sin streng med åtte biter (0er eller 1er), og så må programmet du viser fila i vite hvilken bokstav som hører til hver streng. Hadde en prøvd å åpne en annen filtype (for eksempel et bilde) med denne regel hadde en fått en tekst, men den hadde nesten garantert brutt alle regler og logikk og rettskriving.
Hva så med bilder? Den vanligste måten lagre bilder på er å dele dem opp i mange små kvadrater som kalles pixler, og gi hvert av disse kvadratene en mengde rød, grønn og blå farge. Hver av disse mengdene med farge er igjen lagret som en streng med biter - en lang streng gir mulighet for flere nivåer med farge og gir derfor bilder med bedre kvalitet, men tar også større plass på det mediet de er lagret på. Hver pixel har også en adresse som er som er to tall som forteller posisjonen i forhold til hjørnet oppe til venstre.
Hva skjer så hvis en farger en linje mellom to punkter med adresser som er gitt av de to første ordene i denne teksten og gir den fargen som er gitt av det tredje orde. Hvem vet; men siden vi har datamaskiner kan vi finne ut.
Generatorene som er implementert på disse sidene bruker i varierende grad strukturen i filtypene. Noen virker bare på digitale bilder, andre på alle typer filer. Forskjellen ligger hvordan informasjonen blir hentet ut fra filene og hvor mye disse reglene likner på de reglene som det er intensjonen at filene egentlig skal brukes med. For bilder kan fargene hentes ut og brukes på nytt, mens dette ikke gir mening når det gjelder andre filtyper. Felles for alle generatorene er at de bruker grunnregler som tilegner et stykke informasjon fra en fil en geometrisk form, en farge eller en adresse til et sted på bildet.
Hvem er da som kontrollerer hvordan produktene blir seende ut? Det er uendelig mange måter å programmere en generator og hver og en av disse gir unike resultater for hver unik datafil. All kontroll ligger med andre ord ikke i datafilen. Men heller ikke programmereren har full kontroll siden det er menneskelig umulig for de fleste mulige generatorer å forutse det nøyaktige resultatet. Vi har altså en situasjon hvor programmereren legger visse premisser, men har aldri oversikt siden floraen av datafiler i verden er enorm og voksende.
JAVAgeneratoren:
JAVAgeneratoren er den mest generelle generatoren siden den virker på alle
typer digitale filer. Essensielt består den av to deler - en del som
laster inn data og lager en tabell med desimaltall mellom 0 og 1 av disse,
og en del som bruker tabellen til å lage et bilde. Den første delen har
igjen to utgaver - en som brukes når filen inn er et bilde og en som
brukes på alle andre typer filer. Hvis filen inn er et bilde lages
tabellen ved å bruke middelverdien til fargeverdiene i fire piksler som
danner hjørnene i et rektangel, og flytte dette rektangelet rundt på
bildet slik at vi får hentet ut data fra alle delene av bildet. For alle
andre filtyper lages tabellen ved å hente ut sekvenser av 24 0er og 1er og
lage desimaltall av disse.
Når dette er gjort står vi igjen med en tabell som, avhengig
av størrelsen av filen, inneholder omkring 10000 verdier. Basert på denne
og en regel kan vi lage utbildet. De reglene som er brukt her funger
omtrent som følger: Hent ut to tall fra tabellen og multipliser disse med
henholdsvis høyden og bredden av utbildet. Ved å gjøre dette har vi laget
oss koordinater for hvor et geometrisk objekt skal ha et av hjørnene.
Avhengig av reglen vi bruker kan vi så finne de andre hjørnene i forhold
til det første. Som eksempel skal vi bruke rektangelregelen. Hvis det er
gitt at rektanglenes kanter skal være horisontale og vertikale er alle
rektanglene unikt bestemt av to punkter - hjørnene som står diametralt fra
hverandre. Siden vi har gitt det ene hjørnet kan vi finne det andre ved å
addere et tall til hvert av koordinatene til det første hjørnet. Tallene
vi adderer med er to nye tall fra tabellen, multiplisert med
størrelsesmålet (som er en av knottene du kan skru på), og når dette er
gjort er det bare å be datamaskinen fargelegge rektangelet definert av de
to punktene. De andre reglene fungerer nesten på samme måten.
Når det gjelder fargevalgene kan dette gjøres på to måter: hvis innfilen
er et bilde kan en hente en farge fra bildet på et punkt med koordinater
som lages ved å hente to tall fra tabellen. Hvis vi bruker en annen fil
eller du har skrudd av farge-fra-bildet opsjonen kan en kan lage en farge
ved å hente tre verdier fra tabellen, multiplisere disse med målene for
henholdsvis rød, grønn og blå farge, og la fargen i være den som
fremkommer av disse tallene. Hele denne prosessen gjøres så om igjen så
lenge en har flere tall igjen i tabellen.
PHPgeneratoren:
PHPgeneratoren fungerer kun med JPEG bilder som innfil.
Grunnen til å bruke PHP er at dette språket åpner for å lage skikkelige
bildefiler som kan lastes ned, noe som av sikkerhetsårsaker er svært
vanskelig i JAVA. Generatoren følger en prosedyre som er omtrent som
følger:
For annenhver piksel i bildet hentes fargeverdien ut. Gjør et
gitt antall bitshift (en vanlig operasjon i programmering, men litt
involvert å forklare her. Essensielt lager den et nytt tall fra det gamle
tallet), del det bitshiftede tallet på 1000 og ta vare på resten (som
alltid er et tall mellom 0 og 1). Ved hjelp av denne resten kan vi så lage
koordinater for et av hjørnene på samme måte som i JAVAgeneratoren.
Størrelsen på det geometriske objektet bestemmes av en matematisk funksjon
som kalles et trigonometrisk polynom. Ved å putte posisjonen til det
geometriske objektet inn i funksjonen gir den tilbake et mål på størrelsen
objektet skal ha. Det er tre knotter å skru på for funksjonen - dens
amplitude (hvor sterkt den virker), dens forflytning i rommet (hvor på
funksjonen vi er) og dens båndbredde (hvor fort den går opp og ned). Når
funksjonen er evaluert finnes de andre hjørnene i det geometriske objektet
som i JAVAgeneratoren med den modifikasjon at vi her også må multiplisere
med svaret fra funksjonen.
|