Rotar puntos en un plano 2D
Publicado: 2008-06-22 19:27 @852
Estoy haciendo ( al menos intento ) en un clon de asteroids ( de Atari ) usando Prima, no parece complicado y realmente no lo es... tan solo me he atascado en algo.
En el juego los asteroides y la nave rotan, ese movimiento me tiene mal, en el colegio la trigonometría la usas para hallar ángulos y todo eso pero no para rotar objetos
Busqué en la red y en un par de segundos di con la respuesta pero el algoritmo tiene un problema... la rotación implica desplazamiento que daña el dibujo, es decir, no rota en su propio eje.
Éste es el código que estoy usando.
En el juego los asteroides y la nave rotan, ese movimiento me tiene mal, en el colegio la trigonometría la usas para hallar ángulos y todo eso pero no para rotar objetos
Busqué en la red y en un par de segundos di con la respuesta pero el algoritmo tiene un problema... la rotación implica desplazamiento que daña el dibujo, es decir, no rota en su propio eje.
Éste es el código que estoy usando.
Using perl Syntax Highlighting
sub rotate {
my ( $self, $ang, $canvas ) = @_;
my ( $x0, $y0 ) = $self->{Center};
my @sideX = @{$self->{x}};
my @sideY = @{$self->{y}};
for ( my $i = 0; $i < (@sideX / 2); $i += 2 ) {
# $x0 and $y0 = center; ($x2, $y2) = point 1; ($x3, $y3) = point 2;
my $x2 = int( cos($ang) * ($sideX[$i] - $x0) - sin($ang) * ($sideY[$i] - $y0) + $x0 );
my $y2 = int( sin($ang) * ($sideX[$i] - $x0) + cos($ang) * ($sideY[$i] + $y0) );
my $x3 = int( cos($ang) * ($sideX[$i+1] - $x0) - sin($ang) * ($sideY[$i+1] - $y0) + $x0 );
my $y3 = int( sin($ang) * ($sideX[$i+1] - $x0) + cos($ang) * ($sideY[$i+1] + $y0) );
$canvas->line( $x2, $y2, $x3, $y3 );
}
}
my ( $self, $ang, $canvas ) = @_;
my ( $x0, $y0 ) = $self->{Center};
my @sideX = @{$self->{x}};
my @sideY = @{$self->{y}};
for ( my $i = 0; $i < (@sideX / 2); $i += 2 ) {
# $x0 and $y0 = center; ($x2, $y2) = point 1; ($x3, $y3) = point 2;
my $x2 = int( cos($ang) * ($sideX[$i] - $x0) - sin($ang) * ($sideY[$i] - $y0) + $x0 );
my $y2 = int( sin($ang) * ($sideX[$i] - $x0) + cos($ang) * ($sideY[$i] + $y0) );
my $x3 = int( cos($ang) * ($sideX[$i+1] - $x0) - sin($ang) * ($sideY[$i+1] - $y0) + $x0 );
my $y3 = int( sin($ang) * ($sideX[$i+1] - $x0) + cos($ang) * ($sideY[$i+1] + $y0) );
$canvas->line( $x2, $y2, $x3, $y3 );
}
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4