La curva de Sierpinski es una secuencia definida de forma recursiva de una curvafractalcontinua, descubierta por el matemático polaco Wacław Sierpiński, que en el límite llena completamente el cuadrado unitario: así su curva límite, también llamada "curva de Sierpinski" , es un ejemplo de una curva que recubre una superficie.
es decir, crece "exponencialmente" con más allá de cualquier límite, mientras que el límite para del área encerrada por es la del cuadrado (en métrica euclidiana).
Usos de la curva
La curva de Sierpinski es útil en varias aplicaciones prácticas porque es más simétrica que otras curvas de relleno del espacio comúnmente estudiadas. Por ejemplo, se ha utilizado como base para la construcción rápida de una solución aproximada al problema del viajante (que busca la secuencia más corta de un conjunto dado de puntos): la heurística es simplemente visitar los puntos en la misma secuencia en la que aparecen en la curva de Sierpinski.[1] Para ello, se requieren dos pasos: primero calcular una imagen inversa de cada punto a visitar; luego, ordenar los valores. Esta idea se ha utilizado para construir sistemas de enrutamiento para vehículos comerciales basados únicamente en archivos de tarjetas Rolodex.[2]
Una curva de llenado del espacio es una correspondencia continua del intervalo unidad sobre un cuadrado de lado unidad y así una (pseudo) correspondencia inversa permite relacionar los puntos del cuadrado con los de un segmento unitario. Una forma de construir una correspondencia pseudo-inversa es la siguiente: la esquina inferior izquierda (0, 0) del cuadrado unitario corresponde a 0,0 (y 1,0). A continuación, la esquina superior izquierda (0, 1) debe corresponder a 0,25, la esquina superior derecha (1, 1) a 0,50 y la esquina inferior derecha (1, 0) a 0,75. El mapa inverso de los puntos interiores se calcula aprovechando la estructura recursiva de la curva.
A continuación se incluye el código de una función en Java que calcula la posición relativa de cualquier punto en la curva de Sierpinski (es decir, un valor pseudo-inverso). Toma como entrada las coordenadas del punto (x,y) a invertir, y las esquinas de un triángulo isósceles rectángulo (ax,ay), (bx,by) y (cx,cy). (Obsérvese que la unidad cuadrada es la unión de dos triángulos de este tipo.) Los parámetros restantes especifican el nivel de exactitud con el que se debe calcular la inversa.
El siguiente programa en lenguaje Logo dibuja una curva de Sierpinski mediante un procedimiento de recursión.
to half.sierpinski :size :level
if :level = 0 [forward :size stop]
half.sierpinski :size :level - 1
left 45
forward :size * sqrt 2
left 45
half.sierpinski :size :level - 1
right 90
forward :size
right 90
half.sierpinski :size :level - 1
left 45
forward :size * sqrt 2
left 45
half.sierpinski :size :level - 1
end
to sierpinski :size :level
half.sierpinski :size :level
right 90
forward :size
right 90
half.sierpinski :size :level
right 90
forward :size
right 90
end
//A I M C
package FiguraRecursiva202;
import java.awt.Graphics;
public class FiguraRecursiva extends javax.swing.JFrame {
int i =0;
final int N = 4;
final int H0 = 512;
int h = H0 / 4;
int x0 = 2 *h;
int y0 = 3 * h;
int x, xAnt;
int y, yAnt;
Graphics g2;
public FiguraRecursiva() {
initComponents();
setSize(H0, H0);//tamaño de la ventana
setLocationRelativeTo(this);
}
@Override
public void paint(Graphics g) {
super.paint(g);
this.g2=g;
do{
i = i +1;
x0 = x0 - h;
h = h / 2;
y0 = y0 + h;
x = x0;
y = y0;
xAnt = x;
yAnt = y;
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(FiguraRecursiva.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(FiguraRecursiva.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(FiguraRecursiva.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FiguraRecursiva.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new FiguraRecursiva().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
}
Referencias
↑Platzman, Loren K.; Bartholdi, John J., III (1989). "Spacefilling curves and the planar traveling salesman problem". Journal of the Association of Computing Machinery. 36 (4): 719–737
↑Bartholdi, John J., III. "Some combinatorial applications of spacefilling curves". Georgia Institute of Technology.