PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » загрузка данных из файла *.obj


загрузка данных из файла *.obj

Сообщений 1 страница 9 из 9

1

Прошу помочь малость . Есть файл , читаю строки из файла ,но при дебаге к значению 0.10000000 ,при конвертации добавляются лишние цифры . Пример кода  и файла :

Код:
Structure ObjLoadData
  X.f
  Y.f
  Z.f
  ID.l
EndStructure
Global NewList ObjLD.ObjLoadData()
a=1
If ReadFile(0, "cub2.obj")  
  While Eof(0) = 0 
    Text$ = ReadString(0)
    If Left(Text$,2)="v "
      AddElement(ObjLD())
      x$= Mid(Text$, FindString(Text$, " ", 1)+1, 10)
      y$= Mid(Text$, FindString(Text$, " ", 11)+1, 10)
      z$= Mid(Text$, FindString(Text$, " ", 21)+1, 10)
      
      ObjLD()\X =ValF(x$)
      ObjLD()\Y =ValF(y$)
      ObjLD()\Z =ValF(z$)
      ;Debug "x = "+Str(ObjLD()\X)+" y = "+Str(ObjLD())\Y+" z = "+Str(ObjLD()\Z)
      Debug "x = "+x$+" y = "+y$+" z = "+z$
      v=a
    EndIf
   ; Debug Str(a)+" " +ReadString(0) 
    a=a+1
    Wend
    CloseFile(0)              
  Else
    MessageRequester("Information","Couldn't open the file!")
  EndIf
  ;
  Debug "a = "+Str(a)
  ForEach ObjLD()
    Debug "new list"
       Debug ObjLD()\X
       Debug ObjLD()\Y
       Debug ObjLD()\Z
    Next

Чего-то я не нашёл тут как присоединять файлы . Так что выкладываю код cub2.obj  файла :

Код:
v 5.00000000 3.00000000 -5.00000000
v 0.10000000 -1.00000000 -5.00000000
v 0.20000000 -6.00000000 -0.10000000

0

2

Комп все приравнивает к степени двойки и округляет то, что приравнять нельзя.
Так что ответ нужно искать в работе процессора с дробными числами.

0

3

Спасибо за быстрый ответ . Увы ,для меня сложновато будет разбираться с процессором ,а нельзя ли обойти этот недостаток?
Вот немного лучше результат при использовании double :

Код:
      ObjLD()\X.d =ValD(x$)
      ObjLD()\Y.d =ValD(y$)
      ObjLD()\Z.d =ValD(z$)

результат в дебаге :
0.0000000000000001   и
-0.0000000000000001   и
0.2000000000000001

0

4

polopok написал(а):

а нельзя ли обойти этот недостаток

Это особенность процессора и чтобы обойти, нужно создать свой процессор!

0

5

Снова проблема . Вот код :

Код:
Structure ObjLoadData
  X.d
  Y.d
  Z.d
  Xn.d
  Yn.d
  Zn.d
  ID.l
  IDn.l
EndStructure
Global NewList ObjLD.ObjLoadData()
a=0
If ReadFile(0, "cub4.obj")  
  While Eof(0) = 0 
    Text$ = ReadString(0)
    Tex$  = Mid(Text$,1,2)
    
    If Tex$ = "v "
       AddElement(ObjLD())
       x$= Mid(Text$, FindString(Text$, " ", 1)+1, 10)
       y$= Mid(Text$, FindString(Text$, " ", 11)+1, 10)
       z$= Mid(Text$, FindString(Text$, " ", 21)+1, 10)
      
       ObjLD()\X.d =ValD(x$)
       ObjLD()\Y.d =ValD(y$)
       ObjLD()\Z.d =ValD(z$)
       ObjLD()\ID  =a
      
       Debug "x = "+x$+" y = "+y$+" z = "+z$
    EndIf
    Tex$  = Mid(Text$,1,2)
    If Tex$ = "vn"
       AddElement(ObjLD())

       xn$= Mid(Text$, FindString(Text$, " ", 1)+1, 10)
       yn$= Mid(Text$, FindString(Text$, " ", 11)+1, 10)
       zn$= Mid(Text$, FindString(Text$, " ", 21)+1, 10)          
       ObjLD()\Xn.d =ValD(xn$)
       ObjLD()\Yn.d =ValD(yn$)
       ObjLD()\Zn.d =ValD(zn$)
       
       Debug "xn = "+xn$+" yn = "+yn$+" zn = "+zn$
 
     EndIf
     ;Debug Tex$
    a=a+1
    Wend
    CloseFile(0)              
  Else
    MessageRequester("Information","Couldn't open the file!")
  EndIf
  ;

  ;
  ;
  Debug "a = "+Str(a)
  ForEach ObjLD()
    Debug "new list"
       Debug ObjLD()\X
       Debug ObjLD()\Y
       Debug ObjLD()\Z
       Debug ObjLD()\ID
             Debug "normals"
       Debug ObjLD()\Xn
       Debug ObjLD()\Yn
       Debug ObjLD()\Zn 
  Next

В дебаге получаются нулевые списки ...
Код файла cub4.obj :

Код:
g object1
o object1
v 87.55174712 0.00000000 10.78256092
v 91.55174712 0.00000000 10.78256092
v 91.55174712 4.00000000 14.78256092
v 87.55174712 4.00000000 14.78256092
vn 0.00000000 -1.00000000 0.00000000
vn 0.00000000 1.00000000 0.00000000
vn -1.00000000 0.00000000 0.00000000
s 1
f 1/1/1 2/2/2 3/3/3 4/4/4
s 2
f 8/8/8 7/7/7 6/6/6 5/5/5
s 3
f 5/12/12 6/11/11 2/10/10 1/9/9
s 4
f 3/13/13 2/14/14 6/15/15 7/16/16
s 5
f 4/17/17 3/18/18 7/19/19 8/20/20
s 6
f 8/24/24 5/23/23 1/22/22 4/21/21

Что не так делаю ?

0

6

polopok написал(а):

В дебаге получаются нулевые списки

У меня результат соответствует данным файла.

0

7

А у меня вот так :нулевые и такие по всему дебагу.

Код:
x = 87.5517471 y = 0.00000000 z = 10.7825609
x = 91.5517471 y = 0.00000000 z = 10.7825609
x = 91.5517471 y = 4.00000000 z = 14.7825609
x = 87.5517471 y = 4.00000000 z = 14.7825609
xn = 0.00000000 yn = -1.0000000 zn = 0.00000000
xn = 0.00000000 yn = 1.00000000 zn = 0.00000000
xn = -1.0000000 yn = 0.00000000 zn = 0.00000000
a = 21
new list
87.5517471
0.0
10.7825609
2
normals
0.0
0.0
0.0
new list
91.5517471
0.0
10.7825609
3
normals   ;  ! нулевые и такие
0.0
0.0
0.0
new list
91.5517471
4.0
14.7825609
4
normals
0.0
0.0
0.0
new list
87.5517471
4.0
14.7825609
5
normals
0.0
0.0
0.0
new list
0.0
0.0
0.0
0
normals
0.0
-1.0
0.0
new list
0.0
0.0
0.0
0
normals
0.0
1.0
0.0
new list
0.0
0.0
0.0
0
normals
-1.0
0.0
0.0

Отредактировано polopok (23.05.2012 16:33:01)

0

8

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

0

9

Добро ,попробую пересмотреть алгоритм
Ну наконец-то решил проблемку . Выкладываю код :

код
Код:
Structure LoadData
  Datas$
  DatasID.l
EndStructure
Structure ObjLoadData
  X.d
  Y.d
  Z.d
  Xn.d
  Yn.d
  Zn.d
  ID.l
  IDn.l
EndStructure
Global NewList ObjLD.ObjLoadData() ,NewList ListData.LoadData()
a=0
If ReadFile(0, "cub4.obj")  
  While Eof(0) = 0 
    Text$ = ReadString(0)
    AddElement(ListData())
    ListData()\Datas$ = Text$
    ListData()\DatasID = a
    a=a+1
    Wend
    CloseFile(0)              
  Else
    MessageRequester("Information","Couldn't open the file!")
  EndIf
  ;
    Debug "a = "+Str(a)
  ForEach ListData()
    Debug ListData()\Datas$
  Next
  ;
  ;
  ForEach ListData()
    Select Mid(ListData()\Datas$,1,2)
      Case "v "
               AddElement(ObjLD())
       x$= Mid(ListData()\Datas$, FindString(ListData()\Datas$, " ", 1)+1, 10)
       y$= Mid(ListData()\Datas$, FindString(ListData()\Datas$, " ", 11)+1, 10)
       z$= Mid(ListData()\Datas$, FindString(ListData()\Datas$, " ", 21)+1, 10)
      
       ObjLD()\X.d =ValD(x$)
       ObjLD()\Y.d =ValD(y$)
       ObjLD()\Z.d =ValD(z$)
       ;ObjLD()\ID  =a
     Case "vn"
              AddElement(ObjLD())

       xn$= Mid(ListData()\Datas$, FindString(ListData()\Datas$, " ", 1)+1, 10)
       yn$= Mid(ListData()\Datas$, FindString(ListData()\Datas$, " ", 11)+1, 10)
       zn$= Mid(ListData()\Datas$, FindString(ListData()\Datas$, " ", 21)+1, 10)          
       ObjLD()\Xn.d =ValD(xn$)
       ObjLD()\Yn.d =ValD(yn$)
       ObjLD()\Zn.d =ValD(zn$)
    EndSelect    
  Next
  ;
  Debug "------------------------------------------------------------------------"
  Debug "------------------------------------------------------------------------"
  ;
  ForEach ObjLD()
    If ObjLD()\X Or ObjLD()\Y Or ObjLD()\Z
      Debug "new list"
       Debug ObjLD()\X
       Debug ObjLD()\Y
       Debug ObjLD()\Z
       ; Debug ObjLD()\ID
     EndIf    
    If  ObjLD()\Xn Or  ObjLD()\Yn Or ObjLD()\Zn 
      Debug "normals"
       Debug ObjLD()\Xn
       Debug ObjLD()\Yn
       Debug ObjLD()\Zn 
    EndIf    
  Next
результат в дебаге
Код:
a = 21
g object1
o object1
v 87.55174712 0.00000000 10.78256092
v 91.55174712 0.00000000 10.78256092
v 91.55174712 4.00000000 14.78256092
v 87.55174712 4.00000000 14.78256092
vn 0.00000000 -1.00000000 0.00000000
vn 0.00000000 1.00000000 0.00000000
vn -1.00000000 0.00000000 0.00000000
s 1
f 1/1/1 2/2/2 3/3/3 4/4/4
s 2
f 8/8/8 7/7/7 6/6/6 5/5/5
s 3
f 5/12/12 6/11/11 2/10/10 1/9/9
s 4
f 3/13/13 2/14/14 6/15/15 7/16/16
s 5
f 4/17/17 3/18/18 7/19/19 8/20/20
s 6
f 8/24/24 5/23/23 1/22/22 4/21/21
------------------------------------------------------------------------
------------------------------------------------------------------------
new list
87.5517471
0.0
10.7825609
new list
91.5517471
0.0
10.7825609
new list
91.5517471
4.0
14.7825609
new list
87.5517471
4.0
14.7825609
normals
0.0
-1.0
0.0
normals
0.0
1.0
0.0
normals
-1.0
0.0
0.0

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » загрузка данных из файла *.obj