0

我正在使用空间填充曲线(希尔伯特曲线)来尝试近似通过矩阵中的一组城市的最快方式)。我在项目中的最后一步是将所有数字变成 0 和 1

我使用一个从 0 到 1023 (32x32) 的值矩阵,每当一个数字中有一个城市时,它就会在它们之间画一条线。

我的问题是:如何将这些数字从 0 变为 1023,变为全 0(无城市)和 1(城市)并连接 1?

矩阵代码和我如何填充矩阵在lineRel函数的SimpleGraphics类中。在我的示例中,点 10、123、193、430 和 934 中有城市。

希尔伯特曲线类:

import java.awt.*;
import java.applet.*;   

public class HilbertCurve extends Applet{
private SimpleGraphics sg = null;
private final int dist0=512;
private int dist=dist0;
public static int ix =0;
public static int iy =0;

@Override
public void init(){
    resize(dist0, dist0);
    sg = new SimpleGraphics(getGraphics());
  }

@Override
public void paint(Graphics g){
    int level = 5;
    dist = dist0;
    for(int i=level; i>0; i--) dist/=2;
    sg.goToXY (dist/2, dist/2);
    HilbertU(level);
}

private void HilbertU(int level){
    if(level>0){
        HilbertD(level-1); sg.lineRel(0,dist); iy++;
        HilbertU(level-1); sg.lineRel(dist,0);ix++;
        HilbertU(level-1); sg.lineRel(0,-dist);iy--;
        HilbertC(level-1);
    }
}

private void HilbertD(int level){
    if(level>0){
        HilbertU(level-1); sg.lineRel(dist,0); ix++;
        HilbertD(level-1); sg.lineRel(0,dist); iy++;
        HilbertD(level-1); sg.lineRel(-dist,0); ix--;
        HilbertA(level-1);
    }
}
private void HilbertC(int level){
    if(level>0){
        HilbertA(level-1); sg.lineRel(-dist,0); ix--;
        HilbertC(level-1); sg.lineRel(0,-dist); iy++;
        HilbertC(level-1); sg.lineRel(dist,0); ix++;
        HilbertU(level-1);
    }
}
private void HilbertA(int level){
    if(level>0){
        HilbertC(level-1); sg.lineRel(0,-dist); iy++;
        HilbertA(level-1); sg.lineRel(-dist,0); ix++;
        HilbertA(level-1); sg.lineRel(0,dist); iy--;
        HilbertD(level-1);
    }
}
}

类 SimpleGraphics:

import java.awt.*;

class SimpleGraphics{
private Graphics g = null;
private int x =0, y = 0;
public int a;
public static int[][] matrix = new int[200][200];
int c = 0;
int matrixpoint = -1;
int tempx = 0;
int tempy = 0;
int k=0;

public SimpleGraphics(Graphics g) {
    this.a = 1;
    this.g = g;}

public void goToXY(int x, int y){
    this.x =x;
    this.y= y;
}

public void lineRel(int deltaX, int deltaY){
  if(c ==0)    {matrix[HilbertCurve.ix][HilbertCurve.iy]=matrixpoint;
    c++;
    matrixpoint++;
  }

  matrix[HilbertCurve.ix][HilbertCurve.iy]=matrixpoint;
  matrixpoint++;

 if(k==0 && matrix[HilbertCurve.ix][HilbertCurve.iy]==10){
     tempx = x;
     tempy = y;
 }
    if(matrix[HilbertCurve.ix][HilbertCurve.iy]==123 || matrix[HilbertCurve.ix][HilbertCurve.iy]== 193 ||
            matrix[HilbertCurve.ix][HilbertCurve.iy]==430 || matrix[HilbertCurve.ix][HilbertCurve.iy]== 934 ){
        g.drawLine(tempx, tempy, x, y);
        tempx = x;
        tempy = y;
    }
    x+=deltaX;
    y+=deltaY;
}

}

数字的输出是: 输出数字

路径的输出是:输出路径

4

0 回答 0