sábado, 30 de junho de 2012

Cilindro conectando dois pontos em OpenGL

Como parte do meu TCC, eu tive que quebrar um pouco a cabeça para conseguir dois pontos com um cilindro. Parece fácil, mas a única implementação que encontrei tinha um erro que demorei um pouco a encontrar.

Segue o minha classe C++ para isso:

#include<GL/glut.h>
#include<GL/gl.h>
#include<cmath>
 class Cylinder{
public:
GLdouble _x1;
GLdouble _y1;
GLdouble _z1;
GLdouble _x2;
GLdouble _y2;
GLdouble _z2;
Cylinder(double x1, double y1, double z1, double x2, double y2, double z2);
void render(GLfloat red, GLfloat green, GLfloat blue, GLdouble angle_x, GLdouble angle_y);
};

#define CYLINDER_RADIUS 0.75
#define CYLINDER_SUBDIVISIONS 36

Cylinder::Cylinder(double x1, double y1, double z1, double x2, double y2, double z2){
_x1 = x1;
_y1 = y1;
_z1 = z1;
_x2 = x2;
_y2 = y2;
_z2 = z2;
}

void Cylinder::render(GLfloat red, GLfloat green, GLfloat blue, GLdouble angle_x, GLdouble angle_y){
GLdouble vx, vy, vz, v, ax;
GLUquadricObj *_quadric;

_quadric = gluNewQuadric();
gluQuadricNormals(_quadric, GLU_SMOOTH);

vx = _x2 - _x1;
vy = _y2 - _y1;
vz = _z2 - _z1;

//handle the degenerate case of z1 == z2 with an approximation
if (vz > -0.000001 && vz < 0.000001){
if (vz >= 0.0){
vz = 0.000001;
}else{
vz = -0.000001;
}
}

if (vy > -0.000001 && vy < 0.000001){
if (vy >= 0.0){
vy = -0.000001;
}else{
vy = 0.000001;
}
}

if (vx > -0.000001 && vx < 0.000001){
if (vx >= 0.0){
vx = 0.000001;
}else{
vx = -0.000001;
}
}

v = sqrt( vx*vx + vy*vy + vz*vz );
ax = (180.0/M_PI)*acos( vz/v );

if( vz < 0.0 ) ax = -ax;

glPushMatrix();
glColor3f(red, green, blue);
glRotated(angle_x, 1.0, 0.0, 0.0);
glRotated(angle_y, 0.0, 1.0, 0.0);

//draw the cylinder body
glTranslated( _x1, _y1, _z1 );
glRotated(ax, -vy, vx, 0.0);
gluQuadricOrientation(_quadric,GLU_OUTSIDE);
gluCylinder(_quadric, CYLINDER_RADIUS, CYLINDER_RADIUS, v, CYLINDER_SUBDIVISIONS, 1);

//draw the first cap
gluQuadricOrientation(_quadric,GLU_INSIDE);
gluDisk(_quadric, 0.0, CYLINDER_RADIUS, CYLINDER_SUBDIVISIONS, 1);
glTranslated( 0,0,v );

//draw the second cap
gluQuadricOrientation(_quadric,GLU_OUTSIDE);
gluDisk(_quadric, 0.0, CYLINDER_RADIUS, CYLINDER_SUBDIVISIONS, 1);
glPopMatrix();

gluDeleteQuadric(_quadric);
}

A matemática por trás de todo este código é a seguinte:

Com os dois pontos que desejo conectar obtenho um vetor direção para o meu cilindro. Descubro o angulo entre a direção atual do cilindro e a que quero que ele sigo. Depois calculo o vetor ortogonal à direção original e à final para ter o eixo de rotação. Enfim rotaciono sobre o eixo que descobri pelo ângulo que descobri.

O código original foi escrito por Curran Kelleher e pode ser encontrado em http://lifeofaprogrammergeek.blogspot.com.br/2008/08/opengl-example-rendering-cylinders.html.
A descrição em pseudocódigo que me levou a entender a correção necessária foi escrita por Toby H. J. Smith e pode ser encontrada em http://www.thjsmith.com/40/cylinder-between-two-points-opengl-c

segunda-feira, 11 de junho de 2012

Visão Geral sobre o Pivotal Tracker

"Collaborative, lightweight agile project management tool, brought to you by the experts in agile software development."

É uma ferramenta online gratuita para projetos públicos ou privados com fins acadêmicos e paga para projetos privados. Ganhadora de prêmios como o Jolt de 2009, é interessante para uma série de situações: desde times que não podem se reunir fisicamente até times experientes que simplesmente querem liberar espaço em suas lousas para outras coisas.

Seu ponto forte é agregar vários elementos de um ambiente informativo como o kanban, gráficos burn-up e burn-down e ainda ser capaz de trazer novidades como epics.

Logo quando se cria um projeto é fácil ver sua grande inspiração que é a estrutura de um kanban: icebox é como uma lista de idéias futuras; backlog é o todo de todas as iterações programadas, current é um misto das estórias prontas, sendo feitas e previstas para a iteração atual.
Esta mistura não fica confusa! Cada estória tem um ciclo de vida que vai desde ser estimada, passar por ser começada por alguém, ela então é terminada, entregue e, por fim, pode ser rejeitada ou aceita contando pontos para a iteração atual.
Seus desenvolvedores ainda perceberam que muitos times gostam de categorizar suas estórias em três tipos: funcionalidades; bugs; e "chores" (um tipo de pequenas tarefas que não agragam valor direto a aplicação, mas são importantes para os desenvolvedores). Além destes três tipos, ainda é possível criar releases com datas e acompanhar o quão próximo do seu objetivo você está.

A melhor forma de entender todas estas coisas que mencionei e tudo mais é usando em www.pivotaltracker.com. Mas ainda posso acrescentar a possibilidade de criar tags para estorias, adicionar comentários e anexos nestas, integrar ao github para mensagens de commit sejam mostradas junto da estória e tem uma ferramenta de busca de estórias bem legal (então chega de cartões perdidos =D).

Eu já trabalho com ela há quase 3 anos e não tenho do que reclamar. Vale a pena dar uma chance.

sexta-feira, 1 de junho de 2012

Instalando o Bugzilla no Ubuntu 12.04

Bugzilla é uma ferramenta de gerenciamento de bugs criada e utilizada pela Mozilla Fundation. Ele é bastante interessante para sistemas de código aberto ou sistemas onde o usuário tem uma aior familiaridade com softwares. Uma grande desvantagem dele é a ausência de uma tradução para o português.
Sempre que procuro informações sobre como fazer algo encontro instruções expplicações comando a comando sobre o que cada coisa significa. Na verdade, elas sempre me atrapalharam pois na maior parte dos casos o que me interessa é a "receita de bolo". Então, se quiser mais informações, sinta-se livre para comentar!

O Bugzilla tem as seguintes dependências que podemos resolver com o apt-get:

sudo apt-get install perl mysql-client apache2

Para baixar e descompactar o software no local correto faça:

wget http://ftp.mozilla.org/pub/mozilla.org/webtools/bugzilla-4.2.1.tar.gz
tar -xvf bugzilla-4.2.1.tar.gz
sudo mv bugzilla-4.2.1 /usr/local/

Execute os seguintes comandos:
cd /usr/local/bugzilla-4.2.1
sudo perl install-module.pl --all
sudo ./checksetup.pl

Em um editor de texto abra o arquivo localconfig e mude o sequinte:

$webservergroup = 'www-data';
$db_host = '<seu host>';
$db_name = '<nome do banco que você já criou>';
$db_user = '<usuário para acesso ao banco>';
$db_pass = '<senha de acesso do usuário>';

Execute novamente o comando:

sudo ./checksetup.pl

E forneça os dados pedidos pelo script.

Em /etc/apache2/sites-avaible crie o arquivo bugzilla com o seguinte conteúdo:

<VirtualHost localhost:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www

Alias /bugzilla/ /var/www/bugzilla/
<Directory /var/www/bugzilla/>
AddHandler cgi-script .cgi .pl
Options +Indexes +FollowSymLinks +MultiViews +ExecCGI
DirectoryIndex index.cgi
AllowOverride Limit FileInfo Indexes
Order allow,deny
Allow from all
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

LogLevel warn

CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Por fim execute os comandos:

sudo chmod 644 sites-enabled/bugzilla
cd sites-enabled/
sudo ln -s ../sites-available/bugzilla
sudo /etc/init.d/apache2 restart

Agora você deve conseguir acessar a aplicação por http://localhost/bugzilla

Adaptado do tutorial encontrado em http://vibhurishi.blogspot.com.br/2009/05/howto-install-bugzilla-on-ubuntu-9.html e da documentação oficial http://www.bugzilla.org/docs/4.2/en/html/configuration.html