Java, чтение x-, y-, z-координат из файла - PullRequest
0 голосов
/ 20 сентября 2018

Я делаю 3D-объекты из треугольников.Эти треугольники имеют 3 вектора.Теперь у меня есть файл с большим количеством чисел ... Если строка начинается с "v", то строка имеет координаты x, y и z вектора.Если строка начинается с «f», в строке есть строка вектора в файле .txt, которая мне нужна для моего треугольника.Файл начинается со всех «v», а затем продолжается с «f».

Пример: (число в начале - просто строка)

21 v 1.2000 0.20000 -1.0000 -> Вектор1 (1.2, 0.2, -1)

22 v 1.2000 0.20000 1.00000 -> Вектор2 (1.2, 0.2, 1)

23 v -1.200 -0.2000 1.00000 -> Вектор3 (-1.2, -0.2, 1)

...

71 f 21 23 22 -> Треугольник (Vector1, Vector3, Vector2)

И это то, что я пытался, который, очевидно, не работал, так как я новичок в Java: P

public static ArrayList<Triangle> mesh = new ArrayList<>();

public static void loadObject(String fileName) {
    try {
        Scanner scan = new Scanner(fileName);
        ArrayList<Vector> vectors = new ArrayList<>();

        while (scan.hasNextLine()) {
            if (scan.equals("v")) {
                Vector v = new Vector();
                int i = 0;
                while (scan.hasNextDouble() && i < 3) {
                    if (i == 0) {
                        v.setX(scan.nextDouble());
                    }
                    if (i == 1) {
                        v.setY(scan.nextDouble());
                    }
                    if (i == 2) {
                        v.setZ(scan.nextDouble());
                    }
                    i++;
                }
                vectors.add(v);
            }
            if (scan.equals("f")) {
                Triangle t = new Triangle();
                int j = 0;
                while (scan.hasNextInt() && j < 3) {
                    if (j == 0) {
                        t.setVec1(vectors.get(scan.nextInt() - 1));
                    }
                    if (j == 1) {
                        t.setVec2(vectors.get(scan.nextInt() - 1));
                    }
                    if (j == 2) {
                        t.setVec3(vectors.get(scan.nextInt() - 1));
                    }
                    j++;
                }
                mesh.add(t);
            }
        }
    } catch (Exception e) {

    }
}

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Как насчет этого:

static List<Triangle> parse(String fileName) 
{
  List<Triangle> mesh = new ArrayList<>();  
  Map<String, Vector> vm = new HashMap<>();

  try (Scanner scan = new Scanner(new FileReader(fileName)))
  {
    while(scan.hasNextLine()) 
    {
      String[] p = scan.nextLine().split("\\s");
      if("v".equals(p[1]))
      {
        vm.put(p[0], new Vector(Double.parseDouble(p[2]), Double.parseDouble(p[3]), Double.parseDouble(p[4])));
      }
      else if("f".equals(p[1]))
      {
        mesh.add(new Triangle(vm.get(p[2]), vm.get(p[3]), vm.get(p[4])));
      }
    }
  }
  catch(IOException e)
  {
    e.printStackTrace();
  }
  return mesh;
}
0 голосов
/ 20 сентября 2018

Вы описываете формат файла Wavefron OBJ , для которого уже существует много загрузчиков.Вы должны рассмотреть возможность использования существующего загрузчика вместо того, чтобы катать свой собственный.

Поиск в Google для него Я сразу нашел три загрузчика Java .obj на Github:

Я не использовал ни одногоиз них, так что вам нужно будет попробовать их самостоятельно и посмотреть, предоставляют ли они правильный API для вас и решат вашу конкретную проблему.

...