Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 23.04.2011
Сообщений: 12
1

Программа работает по-разному в VS 2008 и в Code::Blocks

04.02.2014, 14:44. Показов 833. Ответов 7
Метки нет (Все метки)

Помогите разобраться!
Пишу алгоритм преобразования мировых координат в координаты камеры. Пишу в VS 2008.
На определенном этапе столкнулся с нелогичным поведением программы. При последовательных поворотах вокруг разных осей сцена начинает искривляться самым неестественным образом. (То есть где-то что-то не в свою очередь считается)
После безуспешных попыток разобраться попробовал эту программу запустить в Code::blocks (12.11) и, как ни странно, всё заработало как надо. Причем я пробовал в настройках ставить и gcc и ms 2005/2008 - все по прежнему работало правильно.



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//zxy
//Совмещение координатной системы камеры с мировой системой
//1 Z
    sina=camtmp[2].x/sqrt(camtmp[2].x*camtmp[2].x+camtmp[2].y*camtmp[2].y);
cosa=camtmp[2].y/sqrt(camtmp[2].x*camtmp[2].x+camtmp[2].y*camtmp[2].y);
 
    for(int i=1; i<=3; i++)
    {
        newx=camtmp[i].x*cosa-camtmp[i].y*sina;
        newy=camtmp[i].x*sina+camtmp[i].y*cosa;
        camtmp[i].x = newx; camtmp[i].y = newy;
    }
 
 
    for(int i=1; i<=stnum; i++)
//Вот этому циклу FOR следовало бы находиться внизу, под меткой //11 Z
//Однако в VS 2008 программа работает правильно только когда этот
//цикл не ниже следующей строчки присвоения sinb, к которой он не //имеет ни малейшего отношения. 
    {
        newx=st1[i].x*cosa-st1[i].y*sina;
        newy=st1[i].x*sina+st1[i].y*cosa;
        st1[i].x = newx; st1[i].y = newy;
    }
 
 
//2 X
    sinb=camtmp[2].z/sqrt(camtmp[2].z*camtmp[2].z+camtmp[2].y*camtmp[2].y);
    cosb=camtmp[2].y/sqrt(camtmp[2].z*camtmp[2].z+camtmp[2].y*camtmp[2].y);
 
    for(int i=1; i<=3; i++)
    {
        newz=camtmp[i].z*cosb-camtmp[i].y*sinb;
        newy=camtmp[i].z*sinb+camtmp[i].y*cosb;
        camtmp[i].z = newz; camtmp[i].y = newy;
    }
 
//3 Y
    sinc = camtmp[1].z / sqrt(camtmp[1].z*camtmp[1].z + camtmp[1].x*camtmp[1].x);
    cosc = camtmp[1].x / sqrt(camtmp[1].z*camtmp[1].z + camtmp[1].x*camtmp[1].x);
 
    for(int i=1; i<=3; i++)
    {
        newz = camtmp[i].z * cosc - camtmp[i].x * sinc;
        newx = camtmp[i].z * sinc + camtmp[i].x * cosc;
        camtmp[i].z = newz; camtmp[i].x = newx;
    }
 
//11 Z
 
//22 X
    for(int i=1; i<=stnum; i++)
    {
        newz = st1[i].z * cosb - st1[i].y * sinb;
        newy = st1[i].z * sinb + st1[i].y * cosb;
        st1[i].z = newz; st1[i].y = newy;
    }
 
//33 Y
    for(int i=1; i<=stnum; i++)
    {
        newz = st1[i].z * cosc - st1[i].x * sinc;
        newx = st1[i].z * sinc + st1[i].x * cosc;
        st1[i].z = newz; st1[i].x = newx;
    }
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2014, 14:44
Ответы с готовыми решениями:

Программа работает по разному в Debug'e и Release'e
Добрый День! Суть проблемы: есть две программы адекватно работающие в debug'e но в release'e есть...

не работает программа в Code Blocks.
Начал изучать С++ по книге &quot;Прата С - Язык программированния С++&quot; Начал писать код из самого...

Многофайловая программа Code Blocks
нужно вычислить произведение матриц при помощи функций,что делаю не так,в чём ошибки?спасибо файл...

Не запускается программа в Code::Blocks
Доброго времени суток. Я написала программу, но CodeBlocks просто не запускает её. Уже долго сижу,...

7
Заблокирован
Автор FAQ
04.02.2014, 23:45 2
Кроме горы афинных преобразований ничего не увидел, возьми проверь внимательно свои коэффициенты поворота
Цитата Сообщение от PhVG Посмотреть сообщение
cosa, sina
искривляется только потому что какой то из этих коэффициентов "кривой". По опыту скажу что довольно часто возникает ошибка когда народ даёт имя переменной скажем y0 (в math.h есть функция с таким же именем), линковщик студии жуёт код с этим косяком но рабоатет он естестенно некорректно ибо вызывается y0(0). Подобная ошибка может возникать ещё для ряда имён переменных идентичных по семантике с функциями из math.h.
1
0 / 0 / 0
Регистрация: 23.04.2011
Сообщений: 12
05.02.2014, 00:48  [ТС] 3
Сразу на это грешил. Кстати сегодня я добился правильной работы в студии. Поменял тип sina, cosa, newx, newy с float на double. До этого уже пробовал менять все имена переменных, назначал вместо них массив. Но это уж очень ненаглядно в коде смотрелось. Причину проблемы так и не понял. Возможно искривление происходило, когда две оси вращения слишком близко совмещались и погрешность нарастала слишком быстро (но как-то сомнительно). Этот же алгоритм вполне себе работал в 16-битном DOSовском qbasic`е
0
Заблокирован
Автор FAQ
05.02.2014, 01:03 4
PhVG, точность дабла гораздо выше если шёл прогармный рассчёт и критичными были величины порядка 10E-6 то вполне могло получиться, что не хватало точности вычислений

Не по теме:

(правда в моей практике таких коллизий было всего пару)



ЗЫ: ещё факт - виндовым "хранителем" афинных преобразований служит структура XFORM, в которой все поля float
http://msdn.microsoft.com/en-u... s.85).aspx
C++
1
2
3
4
5
6
7
8
typedef struct _XFORM {
  FLOAT eM11;
  FLOAT eM12;
  FLOAT eM21;
  FLOAT eM22;
  FLOAT eDx;
  FLOAT eDy;
} XFORM, *PXFORM;
так что думаю проблема всё же была где то по коду.
1
0 / 0 / 0
Регистрация: 23.04.2011
Сообщений: 12
05.02.2014, 01:38  [ТС] 5
Ради интереса вот он весь во вложении в виде проекта студии. Объявление переменных сразу над int main(). Управление стрелками и "del", "end" вокруг оси Z, а также клавиши z, x - перемещение вдоль оси Z вперед-назад. Если заменить дабл на флоат, то искривление заметно например после значительного поворота в сторону и попытки поворота вокруг Z. Центр вращения всегда должен быть в центре экрана
0
Вложения
Тип файла: rar 3d2dwk.rar (2.78 Мб, 3 просмотров)
Заблокирован
Автор FAQ
05.02.2014, 02:17 6
PhVG, я сильно не вдавался в детали, сразу бросился в глаза какой-то странный рандомный инит
st[i].x=((rand()%10000)-5000)*10;
st[i].y=((rand()%10000)-5000)*10;
st[i].z=((rand()%10000)-5000)*10;
Как я понимаю хотели получить -500...500 с шагом 0,1 а вместо этого получали -50000....50000 с шагом 10( думаю нам всё же нужны были пиксельные размеры и -500...500 было куда уместней)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
float sina, cosa, sinb, cosb, sinc, cosc;
float newx, newy, newz, newx1, newy1;
 
float arx, ary, arz;
 
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
int main()
{
    for(int i=1; i<=stnum; i++)
    {
        st[i].x=((rand()%10000)-5000)/10.0;
        st[i].y=((rand()%10000)-5000)/10.0;
        st[i].z=((rand()%10000)-5000)/10.0;
    }
В остальном при такой инциализации различий с первоначальным вариантом (а именно подобием иммитации звёзд думаю - не пупырышки же делали) я не заметил.
1
0 / 0 / 0
Регистрация: 23.04.2011
Сообщений: 12
05.02.2014, 03:27  [ТС] 7
Нет, размеры никак не связаны с пикселями, просто переписывал свой древний алгоритм 95 года с бейсика на современный лад, там имелось ввиду, что "звёзды" расположены по возможности дальше друг от друга, но запись рандомайза из бейсика не вполне походила на си-шную, вот я и записал как попало.

В любом случае спасибо за попытку помочь разобраться
0
Заблокирован
Автор FAQ
05.02.2014, 03:54 8
PhVG, изложи более конкретно что тебе не нравится в программе?
Из теста у меня работали лишь стрелки и двигалась картина "звёздного неба" я получил аналогичную отработку как с даблом (т.е не было условной линии из рандома по середине экрана) и успокоился.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2014, 03:54

Code::Blocks Не работает GDB
Не могу дебажить программу. Точки останова просто &quot;проскакиваются&quot;. Вот что выдаёт GDB: &gt; break...

Не работает build [Code::Blocks]
Всем привет, во-первых юзаю Windows 7, скачал/установил программу, MinGW тоже. пишу код, &quot;build&quot;...

В Code Blocks Не работает OpenCV
Помогите. Создала проект OpenCV в Code Blocks. Программа сгенерировала вот такой код #include...

Не работает автозаполнение в Code::Blocks
Ребят помогите не работает автозаполнение в CODE :: BLOCKS при попытки ввода названия библиотеки,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.