Preenchimento de figuras

2010/01/27

Tentei localizar uma rotina para desenho no iPhone. Quero carregar uma figura e preencher parte dela com uma cor específica. O preenchimento deve estar contido no menor polígono delimitado por uma borda de cor preta.

Para fazer isso no iPhone, é necessário utilizar a camada mais baixa de programação: OpenGL ES. O motivo é simples: as demais bibliotecas são vetoriais, e o preenchimento é um algoritmo para imagens reticuladas. O exemplo GLSprite tem quase tudo que preciso. Falta apenas ler um pixel (glReadPixels), alterar a cor de um pixel e programar uma rotina de preenchimento com as instruções na Wikipedia (flood/seed fill).

O exemplo GLPaint também tem algum código útil.

Referências:

http://ask.metafilter.com/101438/Getting-to-the-point-in-OpenGL-ES

Depois de procurar bastante, parece que é mais simples utilizar o Quartz:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/11721-manipulating-image-data.html

http://discussions.apple.com/thread.jspa?threadID=1505532

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/ImageSoundResources/ImageSoundResources.html

http://developer.apple.com/mac/library/DOCUMENTATION/GraphicsImaging/Reference/CGImage/Reference/reference.html

Hello Universe!

2010/01/18

Não consegui seguir o exemplo em http://www.iphonesdkarticles.com/2008/07/first-iphone-application.html. A aplicação compila, executa, mas nada acontece ao se pressionar o botão. Acabei por encontrar um outro caminho para realizar a mesma aplicação. Seguirei em parte o roteiro do exemplo original, com algumas simplificações.

Com o iPhone SDK e o XCode instalados, basta seguir as instruções abaixo. Este texto ainda não está concluído e  será elaborado em etapas.

Encontrando a primeira ferramenta:  XCode

Demorei um pouco para encontrar o XCode. As ferramentas de desenvolvimento não ficam junto com as demais aplicações. Tudo que está relacionado com o desenvolvimento fica em /Developer. O aplicativo pode estar em outra pasta, dependendo dos parâmetros da instalação no seu computador.

O XCode instalado no diretório /Developer/Applications
Local de instalação do XCode

A aplicação “Hello Universe”

O aplicação HelloUniverse permite informar nome e sobrenome e apertar um botão para ver uma mensagem. A mensagem apresenta uma saudação parecida com “Marco Mangan says Hello Universe!”. Com este exemplo são apresentadas  três ferramentas (XCode, Interface Builder e iPhone Simulator) e também a utilização de controles e de respostas a eventos.

A tela da aplicação será assim:

Exemplo de dados de entrada e mensagem correspondente.
A aplicação Hello Universe

Criando um novo projeto no XCode

Nas primeiras execuções do XCode, fechei a janela de diálogo inicial Welcome to XCode. Um dia voltarei para estudar a janela 🙂 Selecione o menu File -> New Project… -> IPhone OS Application, escolha o modelo View-based Application e aperte o botão Choose…

Os modelos de projeto do XCode + iPhone SDK
O modelo utilizado: aplicação com base em visão

Selecione uma pasta e salve o projeto com o nome HelloUniverse. Diversos arquivos e referências são gerados de acordo com o modelo:

A aplicação conta com duas classes: um delegador de aplicação (HelloUniverseAppDelegate) e um controlador de visão  (HelloUniverseViewControler). Foi gerado também um recurso que representa a visão da interface gráfica (HelloUniverseViewController.xib em Resources). Cada classe apresenta dois arquivos: o cabeçalho (.h) e a implementação (.m).

Construindo interfaces com a segunda ferramenta: Interface Builder

O construtor de interfaces (interface builder) permite editar os recursos que representam as visões da aplicação. Clique no arquivo HelloUniverseViewController.xib para ativar o construtor de interfaces. O exemplo tem uma única visão. Para editar os atributos da visão ou de seus componentes, use o inspetor de atributos no menu Tools -> Attributes Inspector. Por exemplo, troque a cor de fundo da visão.

Agregando componentes à visão

Para encontrar os  componentes disponíveis, consulte a biblioteca, no menu Tools -> Library. Os componentes que utilizaremos estão em Cocoa Touch – Inputs and Values.

Os quatro componentes da visão são: dois campos de texto (textefields), um botão arredondado (rounded button) e um rótulo (label). Para um acabamento altere as dimensões e posição dos controles e os valores de algumas de suas propriedades. Para os campos de texto, foram alterados os marcadores (place holders), a opção de remover o texto quando a edição inicia (clear when editing begins) e a resposta ao pressionamento da tecla Entra (Return). Então, os atributos ficam, respectivamente, placeholders: First Name e Last Name, Clear When Editing Begins: desmarcado e  Return Key fica em Next:

Altere o título (Title) do botão para Click Me. Aumente a largura do rótulo para poder ler a mensagem e apague o texto (Text). Para simular a interface use a opção File -> Simulate Interface.

Criando um controlador de visão no XCode

Edite o código fonte  do controlador de interface e acrescente atributos e métodos:

//  HelloUniverseViewController.h
#import 

@interface HelloUniverseViewController : UIViewController {
	IBOutlet UITextField *txtFirstName;
	IBOutlet UITextField *txtLastName;
	IBOutlet UILabel *lblMessage;
}

- (IBAction) btnClickMe_Clicked:(id)sender;

@end

Para implementar o controlador, basta alterar o método de desalocação e acrescentar o método que responderá ao pressionamento do botão arredondado. Altere apenas o dealloc, que deve liberar os recursos que foram alocados pela implementação:

//  HelloUniverseViewController.m
#import "HelloUniverseViewController.h"

@implementation HelloUniverseViewController

// deixe o código daqui para cima como está...

- (void)dealloc {
	[txtFirstName release];
	[txtLastName release];
	[lblMessage release];
	[super dealloc];
}

- (IBAction) btnClickMe_Clicked:(id)sender {

	NSString *FirstName = txtFirstName.text;
	NSString *LastName = txtLastName.text;
	NSString *Message = nil;

	if([FirstName length] == 0 && [LastName length] == 0)
		Message = [[NSString alloc] initWithFormat:@"Anonymous says Hello Universe!!!"];
	else if ([FirstName length] > 0 && [LastName length] ==0)
		Message = [[NSString alloc] initWithFormat:@"%@ says Hello Universe", FirstName];
	else if ([FirstName length] == 0 && [LastName length] > 0)
		Message = [[NSString alloc] initWithFormat:@"%@ says Hello Universe", LastName];
	else
		Message = [[NSString alloc] initWithFormat:@"%@ %@ says Hello Universe", FirstName, LastName];

	lblMessage.text = Message;

	[Message release];
}	

@end

Compile o código e inspecione as tomadas do construtor de interfaces (interface builder outlets) do proprietário (file’s owner) e do atendente (first responder) no construtor de interface.


Conectando variáveis de instância aos objetos na visão

Para realizar as conexões, basta utilizar o construtor de interface e realizar as conexões pelo inspetor de conexões (Tools -> Connections Inspector):

Conectando as tomadas do controlador com os componentes da visão.

Respondendo a eventos

Conecte o último elemento, ligando o evento de liberar toque interno do botão com o novo método do atendente.

O evento do botão conectado com o método do controlador.

Salve os arquivos e execute a aplicação no simulador.

Conclusão

As principais diferenças deste roteiro em relação ao exemplo original são a omissão de detalhes e o uso de um modelo de projeto que já possui uma visão associada. Após a conclusão deste exemplo, fica mais fácil seguir roteiros mais complexos:  MoveMe.

Programação no iPhone/iPod

2010/01/16

Resolvi tentar desenvolver uma aplicação para o iPod, apenas para conhecer a plataforma.

O ambiente de desenvolvimento tem 3 GB, vai levar três horas para transferir, mas parece valer a pena.

Tentarei aproveitar para seguir o OpenUP, também para aprender mais sobre essa versão minimalista do UP.

OpenUP

http://epf.eclipse.org/wikis/openup/

http://www.eclipse.org/epf/

Apple Developer Connection

http://developer.apple.com/

http://developer.apple.com/iphone/index.action#downloads

Exemplos

http://www.iphonesdkarticles.com/2008/07/first-iphone-application.html

http://developer.apple.com/iphone/library/navigation/index.html?section=Resource+Types&topic=Sample+Code

Desenho com o Quartz

http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_paths/dq_paths.html#//apple_ref/doc/uid/TP30001066-CH211-TPXREF106

Certificação Java

2010/01/15

O conteúdo do exame mais simples da certificação Java é útil para quem quer iniciar a carreira de programação ou para quem precisa revisar conteúdos básicos.

Exame de Associado Certificado Sun para a Plataforma Java, Standard Edition, Versão 1.0 (CX-310-019)

O exame parece simples, exceto pela duas últimas seções sobre tecnologias cliente e servidor.

O material de apoio poderia incluir o endereço Web de cada referência. Segue o que achei no Google:

    Star Trek Online

    2010/01/14

    É fácil tirar dinheiro dos outros: http://www.startrekonline.com.

    Vai ser difícil achar tempo 😦

    Desafio de Programação do ICPC

    2010/01/12

    Programar um computador pode ser divertido e desafiador. Melhor ainda se for por lazer. Se encontrar tempo, talvez participe:

    http://queue.acm.org/icpc/game_description/main.cfm

    Consegui executar o programa e olhei o código do exemplo. O desafio maior é pensar em uma estratégia, ainda mais considerando que o sucesso depende da estratégia do adversário.

    Talvez fosse o caso de trocar de estratégia, para ter possibilidades diferentes ou então de escolher uma estratégia de acordo com os resultados.

    Tentei me cadastrar no desafio, mas houve alguma falha no formulário. Entrei em contato com o pessoal da ACM e não houve resposta ainda.

    SVN e similares

    2010/01/12

    Existem quatro sistemas de controle de versões que utilizo:

    Pessoalmente, o CVS foi o primeiro repositório utilizado. Por diversos motivos, seu uso está sendo descontinuado pela maioria dos projetos. De fato, nunca consegui uma explicação técnica sobre isso.

    Atualmente, tenho um repositório  hospedado pela empresa wush.net (wush.net):

    https://wush.net/svn/<meu-repositório&gt;

    Qualquer documento importante está naquele repositório, o que simplifica a realização de cópias de segurança e a sincronização entre diversos computadores. Os arquivos sigilosos, guardo em outro local.

    Utilizo o svn em um terminal, sem interface gráfica. Meu histórico mostra os comandos:

    • svn update
    • svn move <arquivo-origem> <arquivo-destino>
    • svn add <arquivo>
    • svn status
    • svn propset svn:keywords “Id” <arquivo>
    • svn del <arquivo>
    • svn commit -m “mensagem”

    Para todo o resto, preciso consultar um manual.

    O git tem a vantagem de ser descentralizado, seria uma opção para deixar de ter que pagar pela hospedagem do repositório. Por outro lado, tenho minhas dúvidas se o sistema funciona nos diversos computadores que utilizo, por causa de restrições de segurança.

    O dropbox é um programa que serve para sincronizar pastas, mas não enfatiza a criação de versões. Utilizo para transferir arquivos que não tenho a intenção de modificar, como documentos em PDF.