MAC 122 Princípios de Desenvolvimento de Algoritmos

Primeiro Exercício-Programa: Gerador de Figuras


Objetivos deste trabalho: familiarização com algum ambiente de desenvolvimento da linguagem C, leitura e impressão em arquivos e alocação dinâmica de memória.

Gerador de Figuras

Neste exercício programa vocês irão escrever um programa que leia o padrão de uma figura representado em um arquivo e gerar em um outro arquivo uma imagem. Exemplos:

Exemplo de Saída
Entrada 1
Saída
Saída 1

Exemplo de Entrada
Entrada 2
Exemplo de Saída
Saída 2

Exemplo de Entrada
Entrada 3
Saída
Saída 3

Exemplo de Entrada
Entrada 4
Saída
Saída 4

Formato PGM

As imagens geradas terão o formato PGM simples. A definição do formato é a seguinte.
  1. Uma primeira linha com o identificador do formato. No caso o identificador é sempre P2.
  2. Uma linha, possivelmente vazia, iniciado com o caractere # seguida de comentários sobre a imagem.
  3. Uma linha contendo dois inteiros, a largura e altura da imagem, respectivamente.
  4. Uma linha contendo um inteiro MaxVal, o valor máximo do tom de cinza.
  5. Nas linhas seguintes os números do arquivo correspondem aos tons de cinza da imagem armazenados em forma de uma matriz de inteiros. Cada tom de cinza é um número entre 0 e MaxVal, com 0 indicando ``negro'' e Maxval indicando ``branco''.

No caso deste trabalho, iremos usar para desenhar as figuras o valor de Maxval igual a 255.

Um exemplo de uma pequena imagem no formato PGM.

P2
# feep.pgm
24 7
15
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
0  3  3  3  3  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0 15  0
0  3  3  3  0  0  0  7  7  7  0  0  0 11 11 11  0  0  0 15 15 15 15  0
0  3  0  0  0  0  0  7  0  0  0  0  0 11  0  0  0  0  0 15  0  0  0  0
0  3  0  0  0  0  0  7  7  7  7  0  0 11 11 11 11  0  0 15  0  0  0  0
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

Visualizador de Imagens PGM

Se o seu windows não tem um visualizador de figuras PGM, recomendamos a instalação do irfanview.

Se você usa Linux, provavelmente qualquer manipulador de imagens abra os arquivos PGM. Por exemplo, os programas display e xzgv que são parte, respectivamente, dos pacotes Debian imagemagick e xzgv.

Formato do Arquivo de Entrada

O arquivo de entrada representa uma figura.
A definição do formato é a seguinte.
  1. A primeira linha contém dois inteiros, a largura e a altura da imagem.
  2. Um inteiro n, o número de segmentos da figura.
  3. Em cada uma das n linhas seguintes, quatro inteiros, x0, y0, x1 e y1. Esses quatro inteiros representam um segmento de reta de (x0, y0) até (x1,y1).

O ponto de coordenadas (0, 0) é o ponto inferior esquerdo da figura. Um ponto (x, y) cai dentro da figura se 0 < x < largura e 0 < y < altura .

Um exemplo de um arquivo de entrada.

101 200
4
10 40 90 40
10 60 90 60
40 10 40 90
60 10 60 90
Essa entrada representa a imagem abaixo.

Exemplo de Entrada

O Gerador de Figura

Você deverá escrever um programa que:
  1. Leia do teclado o nome de um arquivo de entrada contendo a codificação de uma figura.
  2. Leia do teclado o nome de um arquivo de saída que conterá a imagem gerada.
  3. Gerar a imagem de acordo com a descrição abaixo.
A imagem consistirá de 4 cópias da figura dada, de acordo com os exemplos no início desta página.

Descrição da Estrutura de Dados e Definições

Você deverá usar o seguinte em seu programa:
  1. a seguinte estrutura de dados para representar a imagem:
    typedef struct {
      int larg, alt;
      int **img;
    } Imagem;
    
    Os valores de larg e alt são os lidos do arquivo de entrada. A variável img é um apontador para uma matriz de dimensões larg por alt.
  2. as seguintes definições de constantes:
    #define BRANCO 255
    #define PRETO    0
    	  

Funções Fornecidas

  1. Imagem CriaImagem(int larg, int alt);
    Aloca a matriz img, inicializando todas as entradas com valor BRANCO. No caso de ser impossível a alocação de memória, a função aborta o programa.
  2. void DestroiImagem(Imagem imagem);
    Libera a memória usada pela matriz img.
  3. void DesenhaSegmento(Imagem imagem, int x0, int y0, int x1, int y1, int cor);
    Representa na estrutura imagem o segmento de reta ligando (x0,y0) a (x1,y1). Esse segmento é representado na cor cor. O algoritmo de Bresenham é usado na função. A função imprimirá avisos se pontos de segmento estiverem caindo fora da imagem.
  4. int GravaImg(Imagem imagem, char *arq, char *msg);
    Grava a imagem represntada na estrutura imagem o arquivo de nome arq. A mensagem, possivelmente vazia (NULL) é gravada na segunda linha do arquivo. A função devolve 1 se a gravação for feita e retorna 0 se o arquivo não puder ser aberto.
  5. void pinta(Imagem m, int x, int y, int cor);
    Procedimento auxiliar para pintar um ponto na matriz. É usado pela função GravaImg.
  6. int **AlocaMatriz(int m, int n);
    Aloca memória para uma matriz de dimensões m X n. Devolve um apontador para a matriz ou NULL se a alocação não pode ser feita. Usada pela função CriaImagem.
  7. void LiberaMatriz(int **A, int m);
    Libera memória alocada para a matriz A que tem m linhas. Usada pela função DestroiImagem.
  8. void Erro(char *msg);
    Imprime mensagem de erro. Usada pelas funções CriaImagem, GravaImg e pinta, bem como pelo main do executável fornecido. Você talvez não precise usar as quatro últimas funções, que são auxiliares das outras funções.

    Arquivos Fornecidos

    Arquivos pode ser obtidos deste diretório. Os arquivos com extensão jpeg são as imagens convertidas no formato JPEG mais apropriado para os browsers.

    Os arquivos ep1.exe e ep1_linux são exemplos de executáveis fornecidos para o Windows e Linux. Algumas dúvidas de como deve ser o comportamento do programa em algumas situações podem ser resolvidas experimentando esses programas.

    Os arquivos vazio.txt, foradaimagem.txt e enorme.txt testam condições extremas para o programa. Os arquivos pequeno?.txt são arquivos pequenos que servem para você ir testando o programa. As saídas são pequenas e podem ser inspecionadas visualmente usando qualquer editor de textos.

    Outros arquivos poderão ser acrescentados nesse diretório.

    Entrega, Prazos e Observações


    Last modified: Mon Aug 15 11:23:38 BRT 2005