You are on page 1of 8

Polgonos regulares programacin Java

Inforscience
Otro sitio de programacin, algoritmos y
GNU/Linux

http://rendon.x10.mx/?p=78 este es el enlace.


Buscar en google mtodo para calcular las

coordenadas de un polgono

Buscar
Men principal
Ir al contenido principal
Ir al contenido secundario

Inicio
Clip Art
Acerca de

Navegador de artculos
AnteriorSiguiente

De polgonos y estrellas
Posted on 9 febrero, 2012

Hace algn tiempo tuve la necesidad de desarrollar una aplicacin en Java que dibujara
polgonos regulares y estrellas de n lados y n picos respectivamente para una materia en la
escuela. En un principio me fue difcil solucionar este problema pero al final encontr la
manera. A continuacin comento en que consiste la solucin.
Es comn que la mayora de nosotros estemos familiarizados con el sistema de coordenadas
rectangulares donde cada punto en el espacio se representa por dos valores de la forma (x ,

y) donde x, y R, x corresponde al desplazamiento sobre la recta horizontal y y corresponde al


desplazamiento vertical. Vase figura 1.

Figura 1. Plano cartesiano y coordenadas rectangulares.


Con este sistema de coordenadas es posible representar cualquier objeto geomtrico,
incluyendo nuestros polgonos, sin embargo existen otros sistemas de coordenadas que nos
facilitan las cosas para esta tarea en especial, me refiero a las coordenadas polares:

Figura 2. Coordenadas polares. Wikipedia

Como se aprecia en la imagen el sistema consiste en una serie de crculos concntricos con
radios de diferente longitud en el rango [0, ]. Cada punto en el espacio es representado por la
dupla ( r, ) donde r es el radio de un crculo y el ngulo a partir de la recta horizontal en
sentido antihorario. Dependiendo de la unidad en que se midan los ngulos puede tomar los
valores [, ] o [0,2] si la unidad es el radin, o bien [0,360] si la unidad se mide en
grados.
Una vez asimilados estos conceptos podemos formular la solucin. Para un polgono de N lados
y radio r (radio del crculo circunscrito al polgono) las coordenadas de las N esquinas son (r,

12N), (r, 22N),, (r, N2N). Para el caso de la estrella de N picos se trabaja de manera
similar: Se construye un polgono regular de N lados y para cada par de puntos se agrega un
punto ms a la mitad de estos dos con un radio menor a r y por ltimo solo resta unir los puntos
con lneas rectas.
Hablemos un poco a cerca de la implementacin. El lenguaje que empleo aqu es Java pero esto
puede fcilmente ser portado a cualquier otro lenguaje ya que la teora es la misma. Veamos
pues como est conformada el rea de dibujo en Java:

Figura 3. Sistema de coordenadas en Java.


El eje x se comporta tal cual lo conocemos pero al parecer tenemos un pequeo inconveniente
con el eje y que se comporta de forma inversa, cuando y aumenta el desplazamiento es hacia
abajo. Es necesario aplicar una pequea transformacin al eje y para restaurar su
comportamiento y de esta manera facilitarnos las cosas. La transformacin que necesitamos es
una reflexin:

y=maxYy
Donde maxY es la altura del rea de dibujo. Para obtener el valor original de y a partir
de y empleamos la siguiente operacin:

y=maxYy
Ya casi tenemos todo listo para empezar a codificar, solo falta ver cmo convertir las
coordenadas polares a rectangulares, pequeo detalle. De la siguiente ilustracin se puede
observar que tenemos los datos necesarios para obtener las componentes rectangulares de un
punto.

Figura 4. Componentes de un punto.


La componente horizontal es el cateto adyacente y por tanto x=rcos (), el cateto opuesto es la
componente vertical y de ah que y=rsin (). Ahora s, al cdigo. Veamos cmo quedara el
mtodo para calcular las coordenadas de un polgono:
1 /**
2 * Compute the coordinates of a polygon.
*
3 * @param n number of sides
4 * @param center center of the polygon
5 * @param point point of the first corner
*/
6 void computePolygon(int n, Point center, Point point)
7 {
double r = center.distance(point),
8
cx = center.getX(),
9
cy = ly((int)center.getY()),
10
px = point.getX(),
py = ly((int)point.getY()),
11
theta = 2*Math.PI/n,
12
beta = Math.atan2(py - cy, px - cx),
13
x, y, xPrime, yPrime;
14
polygon.clear();
15
16

17
18
19

for (int i = 0; i < n; i++) {


x = r * Math.cos(i * theta);
y = r * Math.sin(i * theta);

20

// Rotate the polygon such that the mouse click matches the polygon corner
xPrime = x * Math.cos(beta) - y * Math.sin(beta);
yPrime = x * Math.sin(beta) + y * Math.cos(beta);

21
22
23

// Translate the polygon to it's original position


xPrime += cx;
yPrime += cy;

24
25
26
27

polygon.add(new Point((int)Math.round(xPrime), (int)Math.round(yPrime)));


}

28 }
29
30
31
32
33
34
35

En las lneas 25 a 27 se hace una rotacin a la figura con el fin de que el primer vertice del
poligono coincida con el punto donde se encuentra el apuntador del ratn. Esta transformacin
en realidad no forma parte del algoritmo sino ms bien por esttica. Los mtodos int ly(int
y) y int oy(int y) se encargan de obtener y y y respectivamente.
private int ly(int y) { return maxY - y; }
private int oy(int y) { return maxY - y; }

Como pueden observer los mtodos son idnticos, sin embargo el objetivo es distinto. Por
claridad los emplearemos para sus respectivas funciones. El cdigo para las estrellas es el
siguiente:
1 /**
2 * Compute the coordinates of a n-pointed star.
*
3 * @param n number of points
4 * @param center star center
5 * @param point first point of the star
*/
6
7 void computeStar(int n, Point center, Point point)
8 {
double r = center.distance(point),
9
theta = 2*Math.PI/n,
10
cx = center.getX(),
cy = ly((int)center.getY()),
11
px = point.getX(),
12
py = ly((int)point.getY()),

13

beta = Math.atan2(py - cy, px - cx),


x, y, xPrime, yPrime;

14
15
16
17
18
19

star.clear();
for (int i = 0; i < n; i++) {
x = r * Math.cos(i * theta);
y = r * Math.sin(i * theta);

20

// Rotate the polygon such that the mouse click matches the star point
xPrime = x * Math.cos(beta) - y * Math.sin(beta);
yPrime = x * Math.sin(beta) + y * Math.cos(beta);

21
22
23

// Translate to it's original position


xPrime += cx;
yPrime += cy;
star.add(new Point((int)Math.round(xPrime), (int)Math.round(yPrime)));

24
25
26

x = 0.5 * r * Math.cos(i * theta + 0.5 * theta);


y = 0.5 * r * Math.sin(i * theta + 0.5 * theta);

27
28
29

xPrime = x * Math.cos(beta) - y * Math.sin(beta);


yPrime = x * Math.sin(beta) + y * Math.cos(beta);

30
31

xPrime += cx;
yPrime += cy;
star.add(new Point((int)Math.round(xPrime), (int)Math.round(yPrime)));

32
33
34

35 }
36
37
38
39
40
41
42
43
44
45

Ahora solo resta construir una interfaz para la aplicacin, sin embargo eso est fuera del
alcance de este post as que no entraremos en detalles. Al final les dejo el cdigo completo de la
aplicacin por si acaso. He aqu el resultado:

Figura 5.El resultado.


Hasta aqu con este post, espero les sea de utilidad. He de comentarles que este tema de los
grficos por computadora es uno de mis temas favoritos ya que es aqu donde encuentro una
aplicacin prctica e interesante a tanta teora de mis cursos de matemticas. Tengo planes de
hacer una serie de artculos a cerca de estos temas con ms detalle y aplicacines. Hasta la
proxima!

R ef er enc ias
[1] Computer Graphics for Java Programmers, Second Edition by Leen AmmeraalandKang
Zhang
[2] Coordenadas polares, Wikipedia
[3] Coordenadas cartesianas, Wikipedia
C di g o f uent e
Polygon.tar.gz

This work, unless otherwise expressly stated, is licensed under a Creative Commons
Attribution-ShareAlike 3.0 Unported License.
Esta entrada fue publicada en Algoritmos, Escuela, Matemtica, Programacin y
etiquetada cateto adyacente, cateto opuesto, codigo fuente, coordenadas
cartesianas, coordenadas polares, cos, dibujar estrellas, poligonos
regulares, sin, trigonometria por D.D.C. Guarda enlace permanente.

You might also like