Entrada 1 |
Saída 1 |
Entrada 2 |
Saída 2 |
Entrada 3 |
Saída 3 |
Entrada 4 |
Saída 4 |
P2.
# seguida de comentários sobre a imagem.
MaxVal, o valor máximo do tom de cinza.
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
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.
largura e a
altura da imagem.
n, o número de segmentos da figura.
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 90Essa entrada representa a imagem abaixo.
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.
#define BRANCO 255 #define PRETO 0
Imagem CriaImagem(int larg, int alt);
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.
void DestroiImagem(Imagem imagem);
img.
void DesenhaSegmento(Imagem imagem, int x0, int y0, int x1, int y1, int cor);
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.
int GravaImg(Imagem imagem, char *arq, char *msg);
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.
void pinta(Imagem m, int x, int y, int cor);
GravaImg.
int **AlocaMatriz(int m, int n);
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.
void LiberaMatriz(int **A, int m);
A que tem
m linhas. Usada pela função
DestroiImagem.
void Erro(char *msg);
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.
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.
programa.c deve ser
entregue até dia 30/8/2005, inclusive.