Ricksmuseum

ArcText, text on a circle / arc

Category: Math, Processing — Rick Companje — 11 January 2008 @ 03:58

ArcText, Text on Arc / circle, Processing / FlashTekst op een boog. Niet moeilijk op zich, maar omdat elke letter een andere breedte heeft moest ik om het helemaal perfect te krijgen qua spatiering weer even wat oude goniometri regeltjes boven halen. De truuk is namelijk voordat je een letter print alvast een beetje te roteren met een hoek die je berekent op basis van de halve breedte van de letter. Dan voeg je eventueel nog een beetje tracking toe als je wilt dat de letters dichterbij over verder uit elkaar staan. Dat doe ik relatief t.o.v. het gekozen lettertype en de fontgrootte volgens de ‘em’ eenheid waarbij 1em de breedte van de letter ‘m’ is. Vervolgens roteer je weer een halve letterbreedte en begin je opnieuw voor de volgende letter.

Dat met die hoek zie je goed in het bovenste plaatje. Je berekent heel gemakkelijk hoek alpha door de inverse tangens te nemen van de overstaande zijde (halve letterbreedte) gedeeld door de aanliggende zijde (straal van de cirkel).

Klik op het onderstaande screenshot voor een interactieve versie waarbij je met de slidertjes de variabelen kunt instellen.

ArcText, Text on Arc / circle, Processing / Flash

View demo
View source
Download source as PDF

Alternatieve Sinus Functie

Category: Math, Information Esthetics, Processing, Science, Art — Rick Companje — 20 November 2007 @ 21:15

Over het algemeen kost het aanroepen van een sinusfunctie binnen een programmeertaal een hoop clock-cycles. Daarvoor krijg je wel een hele nette benadering van de sinus van een getal. Vaak veel te netjes als het mij vraagt. Zijn er alternatieven voor wanneer je wat minder detail nodig hebt? Ja, en die zijn een stuk sneller. [1].

Wat dacht je van:

sinX = 1.2732395*x + (0.4052847*x*x) * (x<0?1:-1);

Het is een aardige benadering van de sinusfunctie die op mijn vaste computer wel even 20x zo snel is als de ingebouwde Processing/Java sinus functie.

Wil je nou iets meer detail dan kun je ‘m nog finetunen door met het resultaat van de vorige berekening nog even het volgende uit te halen.

sinX= .225*((x<0?-1:1)*sinX*sinX-sinX)+sinX;

Die is nog steeds 9x zo snel als de standaard sinus functie.

Ben je benieuwd hoe dit werkt zoek dan even op Taylor reeksen want volgens mij hebben we het oorspronkelijk aan hem te danken.

Taylor wilde iedere willekeurige functie schrijven als een polynoom.
Eventueel met graad oneindig, oftewel: als een oneindige reeks.
De gedachte achter dit polynoom is, dat hij voor het punt x=0 de
zelfde waarde heeft als f(x), maar ook dezelfde afgeleide en 2e
afgeleide, enz. [2]

Fijn om te weten is misschien waar die twee getalletjes (1.2732395 en 0.4052847) precies vandaan komen. Waarom weet ik niet maar de eerste staat voor 4/PI en de tweede voor 4/PI2.

Sourcecode
Zie source Alternatieve-Sinus-Functie
Zie source qSin-Color-Wave-Demo

Zoals je ziet is voor zoiets als het onderstaande de grove benadering prima voldoende:
Cool Sinus

Quick Sine

Cool Sine

Externe links
* http://home.wanadoo.nl/rule-off/wis/reeksen.htm
* http://lab.polygonal.de/
* http://lab.polygonal.de/wp-content/articles/fast_trig/fastTrig.as

VS Stormschade meldingen

Category: Creative Research, Information Esthetics, Data, Making Art of Databases, Globe4D, Science, Processing, Art — Rick Companje — 19 November 2007 @ 11:02

Op 9 nov 2007 ben ik bezig geweest met het zoeken naar CSV bestanden op internet met daarin LON LAT coordinaten en tijd. M’n plan is om die data te verzamelen en weer te geven op een kaart. Dat heb ik gedaan voor stormschade meldingen in de VS en wat je ziet is dan een kaart die door de tijd verandert en waarbij je eigenlijk precies met een beetje fantasie windrichtingen kunt zien. Echt heel vet en super makkelijk. Wellicht interessant voor Globe4D.

VS Stormschade meldingen
Stel je dit voor als een animatie waarbij de meldingen een voor een binnendruppelen in een soort van sliert door het land heen.


Sourcecode

Node.pde

class Node {

  Node next;
  String ini;
  String time;
  float speed;
  String location;
  String county;
  String state;
  String comments;
  float lat;
  float lon;
  int x;
  int y;
  int r;
  int time_hour;
  int time_minute;

  Node(String ini) {
     //this.ini = ini;
     String items[] = split(ini,",");
     time = items[0].substring(0,2) + ":" + items[0].substring(2);
     time_hour = int(items[0].substring(0,2));
     time_minute = int(items[0].substring(2));
     speed = int(items[1]);
     r = int(speed/5);
     if (r<1) r=1;
     location = items[2];
     county = items[3];
     state = items[4];
     lat = float(items[5]);
     lon = float(items[6]);
     int sc = 7;
     x = int(lon*sc + 180*5);
     y = int(lat*sc);
  }

}

CSV_Test_1.pde

import processing.opengl.*;

PFont font;
PImage bg;
Node first;
Node cur;
Node last;

int speed=1; //draw 40 dots per frame

void setup() {
  //Time,Speed,Location,County,State,Lat,Lon,Comments

  String lines[] = loadStrings("060622_rpts_wind.csv");
  println("there are " + lines.length + " lines");

  font = loadFont("AvantGardeITCbyBT-Demi-30.vlw");
  textFont(font, 30); 

  first = new Node(lines[1]);
  cur = first;

  for (int i=2; i < lines.length; i++) {
    cur.next = new Node(lines[i]);
    cur = cur.next;
  }

  cur = first;

  size(800,600);
  //colorMode(HSB,255);
  //background(0);
  //stroke(255);
  smooth();

  //image(bg,0,0);
}

void draw() {
  fill(0,10);
  noStroke();
  rect(0,0,width,height);
  noFill();
  stroke(255);

  for (int i=0; i<speed; i++) {
    ellipse(cur.x,cur.y-100,cur.r,cur.r);
    cur = cur.next;
    if (cur==null) cur=first;
  }

  int ox=-700;
  int oy=100;
  int x=cur.time_hour*60 + cur.time_minute;
  println(ox+x);
  line(ox+x,oy,ox+x,oy+5);
  fill(0,150);
  noStroke();
  fill(0);
  rect(0,0,200,50);
  fill(255);
  text(cur.time, 30, 30);
}

060622_rpts_wind.csv

Time,Speed,Location,County,State,Lat,Lon,Comments
1222,UNK,LEWISTOWN,FULTON,IL,40.4,-90.16,TREE LIMBS DOWN. (ILX)
1302,60,PEKIN,TAZEWELL,IL,40.57,-89.63,(ILX)
......

Icosahedron, de 12-hoek

Category: Math, Processing — Rick Companje — 2 October 2007 @ 10:21

IcosahedraIk ben even bezig geweest met Triangulation: 3D objecten opbouwen uit driehoekjes. Ben nu aanbeland bij de Icosahedron, een 12-hoekig object met 20 vlakken en 30 kanten en bestaande uit allemaal gelijkbenige driehoeken. Iedere driehoek daarbinnen kun je weer opdelen in nieuwe driehoeken zodat je steeds meer detail krijgt en uiteindelijk op iets uitkomt dat bijna een bol is. De Icosahedron is een van de 5 ‘platonic solids’. Een platonic solid is een vorm waarvan alle hoeken en vlakken gelijk en plat zijn.

Platonic Solids

Wordlife screenshot

Category: Semester Project, Processing, Programming, General — Rick Companje — 18 July 2007 @ 12:02


Wordlife screenshot, originally uploaded by rick_companje.

A tiny experiment from last year with indexing words and putting them in a pool.

www.companje.nl/processing/WordLife/

More processing code at: www.companje.nl/processing/

Areas of conflu(x)ence - Art, Space & Technology in the Digital Age

The Interactive Morphogenesis project I did together with Ralph Kok and Irad Lee is accepted for the international art conference: Areas of conflu(x)ence - Art, Space & Technology in the Digital Age.

Location : Sibiu, Romania
Dates : October 4-7, 2007

In our project we demonstrated a concept for interacting with 3-dimensional Lindenmayer Systems (L-systems) models using live sound. Using the dynamics of L-systems, methods for visualizing and synthesizing sound are examined through recursive generation of virtual-artificial organisms. The project shows how L-systems can be used to visualize elements in sound and vice-versa, to demonstrate how sound can be used to grow L-system based, interactive artificial morphogenesis.

More info about the conference at: Mediamatic.net and www.2580association.info

Interactive Morphogenesis

Areas of conflu(x)ence proposes an international debate on the relationship between art and technology in the present digital era, focusing on the impact of the new media in our lives.

Today’s digital technologies have created a new model of understanding different aspects of reality. The change they produced compels us to reconsider the conditioning of our modern lives while their potential demands to be explored. Post-modernist syntax is today reevaluated and there are positions that support the thesis of a hyper-industrialized society.

Science and technology are expected to push forward the frontiers of knowledge, while art is asked to mirror these new experiences. The way we handle our lives and our expectations is changing continuously according to these new frontiers. The place we give to the different aspects of our lives and the spatial articulation of our activities are subjected to constant conceptualization based on a continuous flux of discoveries. What kind of models are we using in perceiving and understanding our new environment? If the tools we use have an influence on the way we deal with our environment,
how do we use their potentiality? What traps are to be avoided? What do we expect from technology? Should the new technologies be a matter of concern? By trying to answer all these questions, the conference intends to identify the present condition of our data driven lives and the factors that influence it.

On the basis of artistic and aesthetic experiences, we will study the ways in which image, sound and space are today affected by the digital technologies.

The conference will also include multimedia performances, an exhibit hall of innovative projects and tours of the art installations. [Mediamatic.net]

interactive-morphogenesis.jpg

Sierpinski Triangle built with Processing

Category: Math, Processing, Programming, General — Rick Companje — 18 January 2007 @ 15:04

The Sierpinski triangle, also called the Sierpinski gasket, is a fractal, named after Wacław Sierpiński who described it in 1915. Originally constructed as a curve, this is one of the basic examples of self-similar sets. [Wikipedia]

Meestal wordt de Sierpinski triangle door een recursieve functie getekend, het kan ook zo:

[code lang=”Java”]
//Sierpinski Triangle by Rick Companje
//2007-01-18

void setup() {
size(256,256);

for(int x=0; x < width ; x++)
for(int y=0; y < height; y++)
if ((x&y)!=0) point(x,y);
}
[/code]

Sierpinski Triangle built with Processing

Sierpinski Triangle me L-Systems

[code lang=”Java”]
//Sierpinski Triangle using L-Systems
//18-1-2007 by Rick Companje

int gen = 0;

void setup() {
size(200,200);
frameRate(4);
stroke(255);
}

void draw() {
float angle = radians(120);
float len = width;
String axiom = “F+F+F”; //triangle

background(0);
translate(width,height-10);
rotate(HALF_PI);

for (int i=0; i < gen; i++) {
axiom = axiom.replaceAll("F","F+F-F-F+F");
len/=2;
}

for (int i=0; i < axiom.length(); i++) {
switch (axiom.charAt(i)) {
case 'F': line(0,0,0,len); translate(0,len); break;
case '+': rotate(angle); break;
case '-': rotate(-angle); break;
}
}

if (gen++ > 5) gen=0;

}
[/code]

Deze is toch wel cooler:
3D Sierpinski Triangle

Koch Curve built with Processing

Category: Math, Processing, Programming, Science, General — Rick Companje — @ 02:59

To view this content, you need to install Java from java.com

[code lang=”Java”]
/* Koch Curve, 2007-01-18 by Rick Companje */

int gen = 0;

void setup() {
size(450,150);
frameRate(5);
stroke(255);
}

void draw() {
float angle = PI/3;
float len = width;
String axiom = “F”;

background(0);
translate(0,height-10);
rotate(1.5*PI);

for (int i=0; i < gen; i++) {
axiom = axiom.replaceAll("F","F-F++F-F");
len/=3;
}

for (int i=0; i < axiom.length(); i++) {
switch (axiom.charAt(i)) {
case 'F': line(0,0,0,len); translate(0,len); break;
case '+': rotate(angle); break;
case '-': rotate(-angle); break;
}
}

if (++gen > 5) gen=0;
}
[/code]

Golden Spiral built with Processing

Category: Math, Processing, Science, Art, General — Rick Companje — 7 January 2007 @ 13:54

Golden Spiral built with ProcessingEen klein experimentje met de gulden snede op de meest makkelijke manier die je je maar kunt voorstellen in processing: Relatief roteren, transleren en schalen.

De gulden snede geeft een verhouding weer die veelvuldig in de natuur wordt aangetroffen. Deze deelt een lijn of lengte zodanig in twee ongelijke delen, dat de verhouding van het kleine tot het grote deel dezelfde is als die van het grote deel tot het geheel.

Als men een rechthoek neemt met zijden a en b, die overblijft na verwijdering van het vierkant met zijde a, zodanig dat deze gelijkvormig is met de oorspronkelijke rechthoek, dan wordt de verhouding a/b de gulden snede genoemd. [Wikipedia]

[code lang=”Java”]
//Golden Spiral
//2007-01-06 by Rick Companje

float phi = (sqrt(5)+1)/2;

size(323,200);
translate(height/phi,0);
scale(height);
noStroke();
smooth();

for (float i=0; i < 10; i++) {
fill(i/10*255);
rect(0,0,1,1);
fill(255,255,0,150);
arc(0,0,2,2,0,PI/2);
scale(1/phi);
rotate(PI/2);
translate(1/phi,0);
}
[/code]

Mobius band

Category: Math, Processing, Programming, General — Rick Companje — 6 January 2007 @ 19:16

mobius.pngDe bekende Mobius band in Processing.

“De Mobiusband of band van Mobius is een bijzondere ruimtefiguur. De band bestaat namelijk alleen uit een plat vlak, maar kan alleen in de driedimensionale ruimte bestaan.” (Wikipedia)

for (float u=0; u < TWO_PI ; u+=.025) {
  stroke(u/TWO_PI,1,1);
  for (float v=-1; v < 1; v+=.05) {
    x = r*(1+v/2*cos(u/2))*cos(u);
    y = r*(1+v/2*cos(u/2))*sin(u);
    z = r*(v/2*sin(u/2));
    point(x,y,z);
  }
}

Bekijk hier de complete source

Memevolution in een memepool

Category: Processing, Creative Research, Semester Project, Programming, Science, Projects, Art, General — Rick Companje — 14 September 2006 @ 16:24

Achtergrond
Een meme is een aanstekelijke gedachte. Het is een idee dat zich van mens tot mens verspreid en zodoende bijna als een virus of levend en vermenigvuldigend organisme gezien kan worden. Een meme is een eenheid van de culturele evolutie, zoals een gen de eenheid is van de biologische evolutie. Memen zijn bijvoorbeeld bekende radiodeuntjes, namen van mensen, de beste manier om een brug te bouwen, de cijfer combinatie 9/11 etc.. Zoals genen zich verspreiden in de genenpoel van biologisch leven, verspreiden memen zich in een memenpool van brein naar brein.

In deze Meme Pool worden mailboxen van mensen geanalyseerd op de memen die zich in hun mailbox bevinden. Dit kunnen onderwerpen zijn als “wintersport Zuid-Frankrijk” en “lunchmeeting 12 uur”. Wanneer mensen een e-mailtje typen doen zij dit vaak vluchtig, om deze reden is de mailbox voor ons één van de meest pure testamenten van de gedachten die mensen hebben als zij een mailtje schrijven.

Wanneer mensen met elkaar communiceren via e-mail en ideeën met elkaar uitwisselen, wisselen zij memen uit (memen kopiëren, zoals biologische genen dat ook doen). Evolutie in een memen poel komt voortdurend voor om dezelfde reden dat evolutie plaatsvindt in de biologische wereld. Wij zij niet instaat ideeën en gedachten exact te kopiëren van anderen. Als mensen een verhaal aan iemand anders vertellen en het wordt voortdurend doorverteld dan kan het startverhaal in grote mate gaan afwijken van het verhaal dat de laatste persoon weer naverteld (memen muteren zoals biologisch genen ook muteren). Wij veranderen, vergeten en herinterpreteren en op deze manier evolueren memen van drager tot drager.
Omdat de verspreiding en evolutie van memen een erg ongrijpbaar proces is hebben wij ervoor gekozen dit als primitief leven te representeren in de laboratoriumachtige opstelling zodoende dit onbekende proces tastbaarder te maken.

Werking
In deze omgeving die de vorm aanneemt van een grote petrischaal bewegen de virtuele representaties van mailboxen rond. In dit project gaan we deze representatie voorstellen als levensvormen. Wanneer bijvoorbeeld twee mensen veel met elkaar zouden communiceren over een bepaald onderwerpt zullen hier levensvormen dichter naar elkaar toe bewegen omdat zij op dat moment een grotere overlap vertonen in hun memen. Op dezelfde manier als een dochter veel lijkt op haar moeder en vader, zo zullen de gedachten waar de communicerende personen mee bezig zijn meer op elkaar gaan lijken.

Door de tijd heen zullen mensen kunnen kijken welke memen zich er in hun mailbox bevinden. Wanneer zij bijvoorbeeld een jaar terug gaan in de geschiedenis van hun mailbox zullen zij ontdekken dat zij op dat moment met heel andere gedachten bezig waren. We volgen de mailbox dat een geheel van memen vormt. Om memen te volgen kun je dus kijken naar de beweging van de mailboxen. De mailbox is geen meme, maar de kleine verschuivingen zijn de oorzaak van memen uitwisseling. We kijken indirect naar de onzichtbare memen net zoals in het begin fysici keken naar subatomaire deeltjes door hun effect op zichtbare deeltjes.

Boggle

Category: Semester Project, Information Esthetics, Processing, Programming, Science, General — Rick Companje — 20 August 2006 @ 16:57

Ik zie ineens dat m’n er naam rechtsboven staat. Hoe toevallig is dat!?
Klik op de afbeelding om de applet te openen.

Springs used for flattening 26 dimensions into 2

View source

Gebruik +/- voor het aantal particles, r voor reset en c voor clear

GMail API

I started experimenting with the GMail API and it rocks!
We’re going to use this API in our Petri-Jungle E-volution project to create life-forms from e-mail. More info follows.

[code lang=”PHP”]$gmailer = new GMailer();
if ($gmailer->created) {
$gmailer->setLoginInfo($gmail_acc, $gmail_pwd, $my_timezone);
if ($gmailer->connect()) {
// $gmailer->fetchBox(GM_STANDARD, “inbox”, 0);
// $gmailer->fetchBox(GM_LABEL, “Globe4D”, 0);
// $gmailer->fetchBox(GM_CONTACT, “all”, 0);
$gmailer->fetchBox(GM_QUERY, “To:Nico”, 0);
$snapshot = $gmailer->getSnapshot(GM_STANDARD);
//echo print_r_xml($snapshot);
print_r($snapshot);
[/code]

The output is a snapshot object like this:
[code lang=”PHP”]
GMailSnapshot Object
(
[created] => 1
[gmail_ver] => cd4adb3001353850
[country] =>
[google_name] => Rick Companje
[have_invit] => 96
[quota_mb] => 1760

[quota_tot] => 2743
[quota_per] => 64
[quota_col] => #006633
[gmail_tip] => Shortcuts: …………

[personality] => Array
(
[0] => Array
(
[name] => Rick Companje
[email] => ……………….

[default] => 1
[reply-to] =>
[verified] => 1
)

)
[label_list] => Array
(
[0] => 3voor12
[1] => ARP Mailing
[2] => Cijfers.net
[3] => Domeinen
[4] => Events

[5] => Fabrique
[6] => Flash
[7] => FlexCoders
[8] => Globe4D
[9] => Hardware
[10] => HHS
[11] => Kamer zoeken

[12] => Lasergame
[13] => Links
[14] => Lowlands 2004
[15] => Lowlands 2005
[16] => Nieuwsbrieven
[17] => Nieuw Zeeland
……..
[view] => 11
[box_name] => Search results for: To:Nico
[box_total] => 190
[box_pos] => 0
[box_display] => 20
[box_query] => To:Nico

[queried_results] => 1
[box] => Array
(
[0] => Array
(
[id] => 10c67372660b17a8
[is_read] => 0
[is_starred] => 0

[date] => 10:28 am
[sender] => Draft
[flag] =>  
[subj] => goed nieuws gmail api
[snippet] =>

[msgid] => 10c67372660b17a8
[labels] => Array
(
[0] => ^r
)

[attachment] => Array

(
)

[long_date] => Thu Jul 13 2006
[long_time] => 10:28 AM
[is_chat] => 0
[chat_length] =>

)
[/code]

Inkblots of your Inbox

Experimenting with visualisation of word patterns in e-mail, blogs, fora, chats and newsgroups.

ScreenHunter_023.jpg

See also: DNA van je inbox

Globe4D at infosthetics.com

After such a brilliant day as yesterday where RTV West announced that the documentary they’re making about Globe4D will be watched by 250.000 people and where ACM Multimedia invitited us for the ACM Multimedia Conference in Santa Barbara California in October 2006, it’s seems to get even more crazy now! Andrew Vande Moere added Globe4D to the Information Aesthetics page!

Globe4D at Information Aesthetics

A big day for Globe4D!

globe4d-congrats.jpgToday, Monday the 3rd of July 2006 was really an amazing day! First, this morning RTV West visited our workspace for a documentary they make about our Globe4D project. And second, we got a positive response from the ACM Multimedia Conference 2006 in California!!! This means Globe4D will be part of the exibition in October!

WOEEEEHEEEEY!!!!

And by the way, our video demonstration has been viewed over 2000 5000 10000! times in the last five days! Awesome!

Interactive Morphogenesis

Category: Making Art of Databases, Language & Text, Gardening, Information Esthetics, Processing, Science, Tech, Projects, Art, General — Rick Companje — 29 June 2006 @ 13:16

Some information on our Making Art of Databases project ‘Interactive Morphogenesis‘ is available now.

morphogenesis400-2.jpg

Interactive Morphogenesis is a project in which I and two other students demonstrated a concept for interacting with three-dimensional Lindenmayer Systems (L-systems) models using live sound.
Using the dynamics of L-systems, methods for visualizing and synthesizing sound are examined through recursive generation of virtual-artificial organisms.
The project shows how L-systems can be used to visualize elements in sound and vice-versa, to demonstrate how sound can be used to grow L-system based, interactive artificial morphogenesis.

morphogenesis400.jpg

DNA van je Inbox…

Watch and interact with the Java Applet (drag with your mouse):

Lees verder…

WordLife

Category: Making Art of Databases, Semester Project, Information Esthetics, Processing, Programming, School, Art, General — Rick Companje — 21 June 2006 @ 22:07

View source

Hash table / Associative array in Processing

Category: Java, Processing, Programming, Tech, General — Rick Companje — @ 18:21

If you need Hash tables / Associative arrays in Processing (processing.org) have a look at the code below.

This example shows how to count the number of occurances of each word in a textfile.

WordCount.pde
[code lang=”Java”]
String lines[];
String list[];

void setup() {
lines = loadStrings(”Fok.txt”);
println(”there are ” + lines.length + ” lines”);

Words words = new Words();

for (int i=0; i < lines.length; i++) {
list = split(lines[i]);
for (int j=0; j < list.length; j++) {
words.addWord(list[j]);
}
}
words.printWords();
}
[/code]

Words.pde

[code lang=”Java”]
class Words {

Hashtable ht=new Hashtable();

void addWord(String txt) {
Word word;
if (ht.containsKey(txt)) {
word = (Word)ht.get(txt);
word.count++;
} else {
word = new Word(txt);
}
ht.put(txt,word);
}

void printWords() {
for (Enumeration e = ht.keys() ; e.hasMoreElements() ;) {
String name = e.nextElement().toString();
Word word = (Word)ht.get(name);
println(word.txt + “: ” + word.count);
}
}
}
[/code]

Word.pde
[code lang=”Java”]
class Word {

public String txt;
public int count = 1;

Word(String txt) {
this.txt = txt;
}
}
[/code]

Next Page »