楼主:
j19951102 (j19951102)
2015-03-29 11:57:55我现在要读取.off file,http://goo.gl/H5tjUY,是一种储存3D图像资讯的格式
例如
OFF
#
# cube.off
# A cube.
# There is extra RGBA color information specified for the faces.
#
8 6 12
1.632993 0.000000 1.154701
0.000000 1.632993 1.154701
-1.632993 0.000000 1.154701
0.000000 -1.632993 1.154701
1.632993 0.000000 -1.154701
0.000000 1.632993 -1.154701
-1.632993 0.000000 -1.154701
0.000000 -1.632993 -1.154701
4 0 1 2 3 1.000 0.000 0.000 0.75
4 7 4 0 3 0.300 0.400 0.000 0.75
4 4 5 1 0 0.200 0.500 0.100 0.75
4 5 6 2 1 0.100 0.600 0.200 0.75
4 3 2 6 7 0.000 0.700 0.300 0.75
4 6 5 4 7 0.000 1.000 0.000 0.75
第一行是OFF
再来可能有注解,用#开头,注解可以在一行中的任意位置
再来8 6 12代表顶点、面、边的个数
接下来8行是顶点的座标
再接下来六行是面的资讯,每一行的第一个数代表这个面有多少顶点
如4 0 1 2 3,代表有四个顶点,后面的四个数字是4个顶点的index
一行中最后面的4个数代表RGBA的资讯,这4个数可有可无
现在问题是我不知道该怎么读取这个档案好:
1)我用scanner去读,用readline读最前面的注解,像这样:
int vertexCount;
int faceCount;
int edgeCount;
String line = "";
while ((line = scanner.nextLine()) != null) {
if (line.startsWith("OFF"))
continue;
else if (line.startsWith("#"))
continue;
else {
String count[] = new String[3];
count = line.split(" ");
vertexCount = Integer.parseInt(count[0]);
faceCount = Integer.parseInt(count[1]);
edgeCount = Integer.parseInt(count[2]);
break;
}
问题是8 6 12这行不一定是用一个空白分开的,可能是用好几个空白分开,
或是最前面也有空白," 8 6 12",这样用nextInt比较好,但是在readline之前
我又不知道这行是不是注解。所以该如何读取这行?
2) 在读取面的资讯时,我用nextInt读取,但是我不知道如何判断这个档案会不会包含
RGBA的资讯,就是不知道一行到底会有多少数字,该如何解决?
问题很多,谢谢你的耐心
split with space, get array length
楼主:
j19951102 (j19951102)
2015-03-29 12:08:00忘了说,面的资讯间的空格也可能是不止一个空白
作者: Expsun (无限燃烧) 2015-03-29 12:10:00
regex?
split以后把长度 > 0 的拿出来,或者上楼上说的更简单像
楼主:
j19951102 (j19951102)
2015-03-29 12:49:00我试试regex,没有用过
作者:
haha02 (来人!上夹棍!)
2015-03-31 22:31:00一行读进来之后先trim然后再用\\s+做split试试?
作者:
k47100014 (MIT_No.14)
2015-04-12 18:07:00如果遇到很多空白的我会用循环+取代s = s.replaceAll("__","_"); //底线为空格然后再用split去隔开