terça-feira, 17 de novembro de 2009

Apresentação

Este blog corresponde ao Portfolio de Marta Filipa Ribeiro Martins, para a Cadeira de Programação do Mestrado em Design e Multimédia, no ano lectivo de 2009/2010.


This blog is a Portfolio of Marta Filipa Ribeiro Martins, for Programming class of '09/10 Multimedia Design Master Degree.  

Projectos em Processing

Projecto Utilitário:

New York Talk Exchange (NYTE) - Globe Encounters, de Aaron Koblin





Aaron Koblin desenvolveu, em 2008, em conjunto com o MIT, um projecto que ilustra as comunicações efectuadas na cidade de Nova Iorque com o resto do mundo a 11 de Janeiro de 2008.
Recolheram os dados dos laboratórios AT&T – transmissão de dados pela Internet e telefonemas de longa distancia - e, em Processing, criaram um globo terrestre com as relações internacionais que Nova Iorque estabelecia com o mundo.



New York Talk Exchange - Globe Encounters



O projecto possui mais duas partes: Pulse of the Planet e The World inside New York, onde se ilustram a quantidade de chamadas internacionais entre Nova Iorque e 255 países num período de 24 horas (estando as cidades com mais chamadas efectuadas de e para Nova Iorque destacadas segundo a zona de fuso horário em que estão inseridas) e quais os locais para onde são efectuadas mais chamadas de Nova Iorque (a cidade está dividida numa grelha em que cada célula está colorida de acordo com os locais para onde as chamadas são efectuadas. A altura das barras coloridas corresponde à quantidade de chamadas para determinada cidade), respectivamente. 




New York Talk Exchange - Globe Encounters





The World Inside New York



Projecto Artístico:

The SheepMarket, de Aaron Koblin




The SheepMarket é um projecto desenvolvido em 2006 por Aaron Koblin, que consiste num conjunto de 10.000 ovelhas viradas para a esquerda desenhadas por trabalhadores da Amazon’s Mechanical Turk (Empresa defensora do conceito de que o ser humano é capaz de efectuar tarefas simples melhor que um computador), com o pagamento de $0.02 por cada ovelha, e projectadas num ecrã luminoso através de Processing.




Através da consulta do site do projecto, é disponibilizado o painel com todas as ovelhas criadas e, ao clicar em cada uma delas, é possível observar o seu processo de criação.
No programa desenvolvido em Processing para o efeito, era disponibilizado o objectivo a cumprir: Desenhar uma ovelha virada para o lado esquerdo, e o valor do pagamento pelo cumprimento deste: $0.02. As ferramentas de desenho (compostas por dois medidores da grossura e da quantidade de cinzento do ponto da ferramenta de desenho) também se encontravam no ecrã e, através da opção Clear, era possível corrigir o desenho que se estava a criar. Após a ovelha desenhada, seleccionava-se a opção Submit e a ovelha passava a fazer parte da colecção. Ao mesmo tempo que o trabalhador desenhava a ovelha, o programa gravava o tempo demorado a criar a ovelha.




Depois de a colecção ser criada, determinou-se o tempo médio de desenho de cada ovelha, bem como o período de tempo que foi gasto para desenhar as 10.000 ovelhas e o valor médio gasto por hora para pagar aos trabalhadores pela criação do desenho.



Mini-Testes

Preparação para o Mini-Teste:



1. Some numbers have an interesting characteristic: If we sum the power of 3 of each
digit we get the initial number. For example, 153 is one of those numbers, since
13+53+33 = 153.

Write a function that indicates if a number possesses or not the above characteristic.
2. Using the function created above write a program that prints all the positive numbers
bellow 1000 that verify the described characteristic.


Mini-Teste I


1.Escreva uma função que receba um número inteiro e devolva o número de dígitos
que o compõe.
2. Escreva uma função que escreva na consola o número total de dígitos dos
números que pertencem a uma tabela de inteiros recebida como parâmetro (tal como
a sua dimensão).

Solução:

1.



2.






Chuck Norris Facts

É-nos apresentado uma Roda dividida em 12 partes, estando cada duas partes numa determinada cor.
Ao clicarmos na roda, esta começa a girar e é-nos apresentado um facto curioso e cómico acerca da famosa personagem Chuck Norris, consoante a cor que "calha" quando a roda pára.

Código do Programa:








Exercícios de Fixação

1. Escreva uma função que devolve TRUE se um numero dado for divisível por 3 e por 7.

2. Escreva uma função que avalie dois numeros e devolve TRUE se eles forem iguais ou
FALSE se eles forem diferentes.

3. Escreva uma função que devolva qual é o maior de três números (assuma que os
números são sempre diferentes)

4. Escreva uma função que some todos os números ímpares entre 1 e 100.

5. Escreva uma função que escreva todos os números entre 1 e um dado valor e a cada
múltiplo de 10 imprima “múltiplo de 10”.

6. Escreva uma função que devolva todos os números entre 1 e 100 que são divisíveis por 3
e 7 ao mesmo tempo.

7. Escreva uma função que devolva TRUE se um determinado número estiver presente
numa tabela de números e FALSE caso contrário.

8. Escreva uma função que calcule a média aritmética de uma tabela de numeros.

Solução:
1.


2.


3.


4.


5.


6.



7.



8.


segunda-feira, 16 de novembro de 2009

Desafios

Desafio I






Dados:
1. Função casa – Desenha uma casa básica (parede e telhado) numa qualquer posição,
com qualquer tamanho e com qualquer cor de parede e de telhado;
2. Função passaro – Desenha um pássaro na posição 250,250, com dimensão fixa.


Objectivos:
Alterar a função passaro, de modo a que possa desenhar o pássaro em qualquer posição da
janela e com qualquer cor
Usando as funções criar uma cena que inclua pelo menos uma casa e um pássaro
A cena pode incluir outros elementos
As funções dadas podem ser modificadas, de modo a que permitam outros comportamentos,
por exemplo desenhar casas mais elaboradas, desenhar pássaros noutras posições (não
apenas de frente), etc…


Resultado:




Código do programa:




Desafio II


Objectivos:

Desenvolva uma aplicação em Processing que seja inspirada no conceito de arte
interativa (http://pt.wikipedia.org/wiki/Arte_interativa). Essa aplicação deve permitir algum tipo de
interação com o usuário através do rato, demonstrando algum tipo de reação às ações
que o usuário realize quando em contato com sua obra artística. Você pode desenvolver
a temática da sua aplicação livremente e ela deve utilizar pelo menos os seguintes
componentes de programação: imagens, texto, formas e cores.
Sua aplicação pode conter qualquer combinação dos componentes propostos, mas não
precisar estar limitada a somente esses componentes. Lembre-se, uma dos objetivos
desse trabalho, além do exercício da criatividade em programação, é possibilitar
explorar, experimentar e descobrir outras funcionalidades da linguagem.

Resultado:




Código:


color[]c= new color[13]; //Criação do Array de Cores

PFont titulo; //Criação da variável para a fonte
PFont nome;
PImage fundo; //Importação de uma imagem
void setup() {

  background(125);
  size(500, 500);

  //Array de Cores (Para a paleta de Cores)
  c[0]= color(14, 194, 1); //verde
  c[1]= color(228, 1, 1); //vermelho
  c[2]= color(244, 252, 19); //amarelo
  c[3]= color(252, 19, 157); //rosa
  c[4]= color(154, 202, 255); //azul
  c[5]= color(218, 103, 247); //roxo
  c[6]= color(255,168, 0); //laranja
  c[7]= color(138, 91, 1); //castanho
  c[8]= color(0,0,0); //preto
  c[9]= color(115,115,115); //cinza-escuro
  c[10]= color(181, 181, 181); //cinzento
  c[11]= color(255,255,255); //branco
  c[12]= color(125,125,125); //borracha

  fundo = loadImage("fundo.png"); //Load da imagem de fundo

  titulo = createFont("4 Star Face Font", 50); //Criação de uma determinada fonte
  nome = createFont("Century Gothic", 12);
}

void draw(){
  image(fundo,0,0); //Colocação da imagem de fundo no programa
  instrucoes();
  tamanhos();
  cores();
  figuras();
  escreve();
  desenhaStick();

}

void desenhaStick(){ //Função para o rato desenhar
  if ((mousePressed == true) && (mouseButton == LEFT)) {

    line(mouseX, mouseY, pmouseX, pmouseY);
  }
  else if ((mousePressed == true) && (mouseButton == RIGHT)) {
    strokeWeight(10);
    stroke(c[12]);
    line(mouseX, mouseY, pmouseX, pmouseY);
  }
}

void instrucoes(){
  PImage teclas; //Importação de uma imagem
  teclas = loadImage("Keys.gif");
  image(teclas,5,20);

}

void escreve() {  //Função que vai buscar à Caixa de texto o nome do Desenho criado e o adiciona a uma frase pré-determinada
  fill(0);
  textFont(titulo);
  fill(0,0,0);
  text("Stickman Creator", 160, 50);


  int iMrg = 150; //Tamanho da caixa de texto
  int iHgt = 30;

  Panel inputPanel = new Panel(); //Criação de uma área para colocar a área de texto
  inputPanel.setLayout(new BorderLayout());
  //add(inputPanel);
  inputPanel.setBounds(110,440, iMrg,iHgt);
  TextField input = new TextField("John"); //Criação da caixa de texto
  String iLine = input.getText(); //Vai buscar o que está escrito na caixa de texto
  // inputPanel.add(input);
  //setLayout(new BorderLayout());

  textFont(titulo, 40);
  fill(0);
  text("Hi, my name is " + iLine + "!", 110, 430);
  fill(255);
  textFont(nome);
  text("Marta Martins 2009105021", 340, 480);
}

void figuras(){ //Função para criar determinadas formas geométricas, de acordo com a tecla "clicada"
  if( key == '6' ) {
    fill(0,0,0);
    strokeWeight(1);
    rect(width/2, height/2, 50, 50);
  }
  else if(key == '7' ) {
    fill(0,0,0);
    strokeWeight(1);
    rect(width/2, height/2, 150, 150);
  }
  else if(key == '4' ) {
    fill(0,0,0);
    strokeWeight(1);
    ellipse(width/2, height/2, 50, 50);
  }
  else if(key == '5' ) {
    fill(0,0,0);
    ellipse(width/2, height/2, 150, 150);
  }
}

void tamanhos(){//Função para criar diferentes espessuras de linha, de acordo com a tecla "clicada"
  if(key == '1' ) {
    strokeWeight(1);
  }
  if(key == '2' ) {
    strokeWeight(2);
  }
  if(key == '3' ) {
    strokeWeight(3);
  }
}

void cores(){//Função para seleccionar as cores de desenho, de acordo com a tecla "clicada"

  if(key == 'r' ) {
    stroke(c[1]);
  }

  if(key == 'g' ) {
    stroke(c[0]);
  }
  if(key == 'y' ) {
    stroke(c[2]);
  }
  if(key == 'p' ) {
    stroke(c[3]);
  }
  if(key == 'b' ) {
    stroke(c[4]);
  }
  if(key == 'l' ) {
    stroke(c[5]);
  }
  if(key == 'o' ) {

    stroke(c[6]);
  }
  if(key == 'k' ) {
    stroke(c[7]);
  }
  if(key == 'c' ) {
    stroke(c[8]);
  }
  if(key == 'z' ) {
    stroke(c[9]);
  }
  if(key == 'j' ) {
    stroke(c[10]);
  }
  if(key == 'w' ) {
    stroke(c[11]);
  }
  if(key == 'e' ) {
    strokeWeight(10);
    stroke(c[12]);
  }
}

Desafio III


Objectivos:

Pretende-se que desenvolva uma pequena aplicação capaz de permitir ao utilizador
manipular com o rato e o teclado um tipo de forma geométrica à sua escolha (por
exemplo quadrados ou triângulos). Deve criar uma classe para representar a forma
escolhida e dotá-la dos atributos (variáveis) e comportamentos (métodos) necessários.
Como mínimo a aplicação deve permitir ao utilizador criar formas (com o botão
esquerdo do rato) e apagar formas (com o botão direito). A aplicação deverá ainda
responder ao teclado, devendo ser definidas teclas que levem todas as formas existentes
a mudar de cor, a mudarem de posição (para posições aleatórias), a aumentar de
tamanho e a diminuir de tamanho.


Resultado:






Código:



Quadrado a;


class Quadrado {
  int cx, cy;
  float cor1, cor2, cor3;
  Quadrado (int x, int y, int c1, int c2, int c3){
    cx = x; 
    cy = y;
    cor1 = c1;
    cor2= c2;
    cor3 = c3;
  }


  void display(){
    fill(cor1, cor2, cor3);
  }
  void MudaAzul(){ //Muda a cor dos quadrados desenhados a seguir para Azul
    cor1 = 0;
    cor2 = 0;
    cor3 = random(255);
    display();
  }
  void MudaVerde(){ //Muda a cor dos quadrados desenhados a seguir para Azul
    cor1 = 0;
    cor2 = random(255);
    cor3 = 0;
    display();
  }
  void MudaArcoIris(){ //Muda a cor dos quadrados desenhados a seguir para Azul
    cor1 = random(255);
    cor2 = random(255);
    cor3 = random(255);
    display();
  }
  void MudaVermelho(){ //Muda a cor dos quadrados desenhados a seguir para Azul
    cor1 = random(255);
    cor2 = 0;
    cor3 = 0;
    display();
  }


  void MudaPosicao(){ // Muda a posição dos quadrados desenhados posteriormente a accionar-se este método
    display();
  }


  void AumentaTamanho(){ //Aumenta o tamanho dos quadrados desenhados posteriormente, até atingirem os limites do background
    if((cx <=width) && (cy<=height)){
      cx = cx + 1;
      cy = cx + 1;
      display();
    }
  }


  void DiminuiTamanho(){ //Diminui o tamanho dos quadrados desenhados posteriormente, enquanto os valores forem positivos
    if((cx >=0) && (cy>=0)){
      cx = cx - 1;
      cy = cx - 1;
      display();
    }
  }


  void desenha(){
    rect(mouseX, mouseY, cx, cy);//Método para construir o quadrado de 100x100 ao clicar com o botão esquerdo do rato
    display();
  }


  void apaga(){
    fill(255);
    noStroke();
    rect(mouseX, mouseY, cx, cy);//Método para apagar quadrados, desenhando quadrados da mesma cor do fundo
    display();
  }
}


void titulo(int a,int m){
  PFont tit;
  tit = createFont("Aberration", 35); 
  fill(0);
  textFont(tit);
  text("Squares go Mad!", a, m);
}


void imagem(int a, int m){
  PImage fundo;
  fundo = loadImage("fundo.png");
  image(fundo,a,m);  
}
void setup(){
  background(255);
  size(500,500);
  a = new Quadrado(90,90,255, 0, 0); //Desenha-se um quadrado com a Cor inicial Vermelha
  a.display();
  imagem(0,0);
  titulo(120,50); 



void draw(){
  if(key == '5'){
    a.AumentaTamanho(); 
  }


  if(key == '6'){
    a.DiminuiTamanho();  
  }
  if ((mousePressed == true) && (mouseButton == RIGHT))  { 
    a.apaga(); 
  }


  if ((mousePressed == true) && (mouseButton == LEFT))  { 


    a.desenha(); 
  }


  if(key == '1' ) {
    a.MudaAzul();
  }
  if(key == '2' ) {
    a.MudaVerde();
  }
  if(key == '3' ) {
    a.MudaArcoIris();
  }
  if(key == '4' ) {
    a.MudaVermelho();
  }







































Exercícios Realizados na Aula

Carro


Código:

// Declare car object as a globle variable.
 Car myCar;
 Car myCar1;
 void setup() {
   size(200,200);
   // Initialize Car object and Initialize car object in setup() by calling constructor.
   myCar = new Car(175, 33, 50, 1);
   myCar1 = new Car(201, 44, 20, 2);
 }
 void draw() {
   background(255);
   //Operate Car object and Operate the car object in draw( ) by calling object methods using the dots syntax.
   myCar.move();
   myCar.display();
   myCar1.display();
   myCar1.move();
 }
 // Define a class below the rest of the program.
 class Car {
   // Variables.
   color c;
   float xpos;
   float ypos;
   float xspeed;
   // A constructor.
   Car(color tempcor, float tempx, float tempy, float tempxspeed) {
   c = tempcor;
   xpos = tempx;
   ypos = tempy;
   xspeed = tempxspeed;
 }
 // Function.
 void display() {
 // The car is just a square
   fill(c);
   rect(xpos,ypos,50,25);  
 }
 // Function.
 void move() {
   //Here we move the car on the x line (xpos) and to move we also change the speed (xspeed)
    xpos = xpos + xspeed;
   //if xpos is bigger than 200 (the size of my window), xpos changes to 0
    if (xpos > width){
      xpos = 0;
    }
  }
 }

Resultado:
























Bola


Código:


Ball b, b1, b2, b3;

class Ball {
  int cx, cy, rad;
  float cor1, cor2, cor3;
  Ball (int x, int y, int r, int c1, int c2, int c3){ //Constructor
    cx = x;
    cy = y;
    rad = r;
    cor1 = c1;
    cor2 = c2;
    cor3 = c3;
  }

  void display(){//Method
    fill(cor1, cor2, cor3);
    ellipse(cx, cy, 2*rad, 2*rad);
  }

  void ChangeColor(){
    cor1 = random(255);
    cor2 = random(255);
    cor3 = random(255);
    display();
  }
 
  void grow(){
    rad += 5;
    display();
  }

}

void setup(){

  size(200,200);

  b = new Ball(50,50,30, 255, 0, 0);
  b1 = new Ball(80, 75, 10, 0, 0, 255);
  b2 = new Ball(92, 85, 5, 0, 255, 0);
  b3 = new Ball(98, 91, 3, 255, 255, 255);

  b.display();
  b1.display();
  b2.display();
  b3.display();
}

void draw(){
  if(mousePressed == true){
    b.ChangeColor();
    b1.ChangeColor();
  }
  if(keyPressed == true){
    b.grow(); //Só a primeira bola cresce porque não se chamaram as outras
  }
}


Resultado:

























Avião Segue o Rato

Foi proposto que se desenhasse uma imagem semelhante a um avião de papel e que este seguisse o ponteiro do rato.

Resultado




Desenhar Casas

O objectivo é criar uma função que nos permita desenhar uma casa tem localizações e com tamanhos diferentes.

Resultado


Código do programa



Círculo Giratório

No final do exercício, deve-se obter um Círculo possível de dividir em qualquer número de partes, em que duas delas se movimentam em sentidos contrários, ao mesmo tempo que o círculo aumenta e diminui de tamanho.
Resultado



Código do programa:
:

Círculo de Cores

Pretende-se criar um círculo dividido num X número de partes em que depois as cores de cada parte rodem num determinado sentido.

Resultado:


Código do programa:


Linhas

Um dos exercícios iniciais foi desenhar linhas cujas cores mudassem de 3 em 3 linhas.

Resultado:



Código do programa:


No exercício de desenhar o Círculo dividido, naquele caso, em 4 partes de cores diferentes, devido à atribuição de um valor diferente numa das variáveis, o resultado obtido foi o seguinte:



Modificando a FrameRate para um valor relativamente baixo, o aspecto final seria quase de um relógio, pois a parte colorida movia-se como se fosse o ponteiro dos segundos.

Código do Programa:


Quantos 1's e 0's existem num determinado número binário?

Resultado:





Calcular a Média de números de um Array (tabela):





Elevar um número ao quadrado e retirar os dois dígitos menos significativos





Averiguar se determinado número é ou não primo (divisível apenas por si próprio e por um)






Soma dos dígitos de determinado número:




Verificar se determinado número está presente na Tabela: