For my project,I want to display my name and enable user to interact with the design. I watched a few videos on steering behaviours. Basically all “vehicles” behave independently and move towards a certain point on the text. I referenced Aaron’s textLine example on how to turn a text to points and I modified a Vehicle class from a Daniel Shiffman’s example.
If any “vehicle” is within a certain range of the cursor provided the cursor is moving, the target would change from a point on the text to the cursor and that is how user is able to interact and change the text.
the font and full code can be found on:
https://github.com/ross67/IntroToIm/tree/master/interactiveName
//Thanks to Daniel Shiffman for explanation on steering behaviors on his Youtube Channel:https://www.youtube.com/user/shiffman // the vehicle class is modified from his coding example on https://www.youtube.com/watch?v=4zhJlkGQTvU import geomerative.*; String fontName = "IndieFlower.ttf"; String textTyped = "Ross Jiang"; RFont font; RPoint[] pnts; Vehicle[] vehicles = new Vehicle[600]; void setup(){ //size(800, 600); size(1440,900); background(51); noFill(); stroke(255); RG.init(this); font = new RFont(fontName, 230, RFont.LEFT); RCommand.setSegmentLength (10); RCommand.setSegmentator(RCommand.UNIFORMLENGTH); RGroup grp; grp = font.toGroup(textTyped); grp = grp.toPolygonGroup(); pnts = grp.getPoints(); //define the vehicles for (int i=0; i<150; i++){ //left Vehicle v = new Vehicle(0, i*9.6); vehicles[i] = v; } for (int j=150; j<300; j++){ //right Vehicle v = new Vehicle(1440, (j-150)*9.6); vehicles[j] = v; } for (int k=300; k<450; k++){ //top Vehicle v = new Vehicle((k-300)*6, 0); vehicles[k] = v; } for (int l=450; l<600; l++){ //bot Vehicle v = new Vehicle((l-450)*6, 900); vehicles[l] = v; } } void draw(){ background(51); int index = 0; for (Vehicle v: vehicles){ PVector p = new PVector(pnts[index].x+250,pnts[index].y+400); v.arrive(p); v.update(); v.display(); index++; } }
class Vehicle{ PVector position; PVector velocity; PVector acceleration; boolean mouseClose = false; float maxForce; //max steering force (how fast it can turn around) float maxSpeed; // max speed Vehicle(float x, float y){ acceleration = new PVector(0,0); velocity = new PVector(0,-2); position = new PVector(x,y); maxSpeed = 4; maxForce = 0.1; } // Method to update position void update() { // Update velocity velocity.add(acceleration); // Limit speed velocity.limit(maxSpeed); position.add(velocity); // Reset accelerationelertion to 0 each cycle acceleration.mult(0); } void applyForce(PVector force) { // We could add mass here if we want A = F / M acceleration.add(force); } void arrive(PVector target){ checkMouse(); PVector desired = PVector.sub(target,position); // A vector pointing from the position to the target if(mouseClose){ PVector mouse = new PVector(mouseX,mouseY); desired = PVector.sub(mouse,position); // A vector pointing from the position to the cursor } float d = desired.mag(); // distance b/w position and target if (d < 100) { float m = map(d,0,100,0,maxSpeed); // if vehicle is close enough, slow down desired.setMag(m); } else { desired.setMag(maxSpeed); // or else set it to max speed } // Steering = Desired minus Velocity (could potential move backwards) PVector steer = PVector.sub(desired,velocity); steer.limit(maxForce); // Limit to maximum steering force applyForce(steer); } void display() { ellipse(position.x, position.y, 6, 6); } void checkMouse() { PVector mouse = new PVector(mouseX,mouseY); float d = PVector.sub(mouse,position).mag(); if (d<333 && mouseX!=pmouseX && mouseY!=pmouseY) { mouseClose = true; println(d); }else{ mouseClose = false; } } }