0 / 0 / 1
Регистрация: 11.04.2013
Сообщений: 138
Записей в блоге: 1
1

Алгоритм Брезенхема. Проверьте корректность перевода (C++ -> Delphi)

30.03.2015, 17:49. Показов 703. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
пытаюсь уже не первый день написать Брезенхейма для 3D линии.
п.с. если у кого то есть примеры рисования в delphi 3д обьектов пошагово(каждую точку "получаем и ставим") (круг линия треугольник квадрат) то поделитесь пожалуйста!
А тут - проверьте правильность.
был в с++
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
namespace MGML_MATH
{   
 template <class T>
 inline T SIGN(T num)  { return (num > (T)0) ? (T)1 : (T)-1; } 
};  
 
 
    template<class Trace_Specific>
    bool Bresencham3D(const VECTOR<3,int>& p1,const VECTOR<3,int> && p2,Trace_Specific* pTss)       
    {
        typedef Trace_Specific TS;
 
        int x = p1.x;
        int y = p1.y;
        int z = p1.z;
 
    //  if(x < 0) x  =  0;
    //  if(y < 0) y  =  0;
    //  if(z < 0) z  =  0;
  
        int dx = abs(p2.x-x);
        int dy = abs(p2.y-y);
        int dz = abs(p2.z-z);
 
        int sx = MGML_MATH::SIGN(p2.x-x);
        int sy = MGML_MATH::SIGN(p2.y-y);
        int sz = MGML_MATH::SIGN(p2.z-z);
 
        if( (dy>=dx) && (dy>=dz) )
        {
            register int e_yx = (dx-dy) << 1;
            register int e_yz = (dz-dy) << 1;
 
            e_yx -= (e_yx >> 1);
            e_yz -= (e_yz >> 1);
            
            for(register int i=0;i<dy;i++)
            {
                if(trace_in_voxel<TS>(x,y,z,pTss)) 
                    return true;
                if(e_yx>=0)
                {   
                    x += sx;
                    e_yx -= (dy << 1);
                    if(trace_in_voxel<TS>(x,y,z,pTss)) 
                        return true;
                }
 
                if(e_yz>=0)
                {   
                    z += sz;
                    e_yz -= (dy << 1);
                    if(trace_in_voxel<TS>(x,y,z,pTss)) 
                        return true;  
                }
 
                y += sy;
                e_yx += (dx << 1);
                e_yz += (dz << 1);
            }
        }
        else if( (dx>=dy) && (dx>=dz) )
        {
            register int e_xy = (dy-dx) << 1;
            register int e_xz = (dz-dx) << 1;
 
            e_xz -= (e_xz >> 1); 
            e_xy -= (e_xy >> 1); 
            
            for(register int i=0;i<dx;i++)
            {
                if(trace_in_voxel<TS>(x,y,z,pTss)) 
                    return true;
        
                if(e_xy>=0)
                {
                    y += sy;
                    e_xy -= (dx << 1);
                    if(trace_in_voxel<TS>(x,y,z,pTss)) 
                        return true;
                }
 
                if(e_xz>=0)
                {
                    z += sz;
                    e_xz -= (dx << 1);
                    if(trace_in_voxel<TS>(x,y,z,pTss)) 
                        return true; 
                }
                x += sx;
                e_xy +=(dy << 1);
                e_xz +=(dz << 1);
            }  
        }
        else // (dz>=dy) && (dz>=dx)
        {
            register int e_zx = (dx-dz) << 1;
            register int e_zy = (dy-dz) << 1;
 
            e_zx -= (e_zx >> 1);
            e_zy -= (e_zy >> 1);
            
            for(register int i=0;i<dz;i++)
            {
                if(trace_in_voxel<TS>(x,y,z,pTss)) 
                    return true;
                if(e_zx>=0)
                {
                    x += sx;
                    e_zx -= (dz << 1);
                    if(trace_in_voxel<TS>(x,y,z,pTss)) 
                        return true;
                }
                if(e_zy>=0)
                {
                    y += sy;
                    e_zy -= (dz << 1);
                    if(trace_in_voxel<TS>(x,y,z,pTss)) 
                        return true;
                }
 
                z += sz;
                e_zx +=(dx << 1);
                e_zy +=(dy << 1);
            }  
 
 
        }
 
        if(trace_in_voxel<TS>(x,y,z,pTss)) 
            return true;
        return false;
    }
Переписал в Делфи
Delphi
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
procedure TForm1.Button1Click(Sender: TObject);
 
var
    z1,z2,x1,x2,y1,y2,dx,dy,dz,s1,s2,s3,x,y,z,o,oz,i,v,obmen,e_yx,e_yz,e_xz, e_xy, e_zx, e_zy  : integer;
begin
  memo1.Clear;
  x1:=strtoint(edit1.Text);
  y1:=strtoint(edit2.Text);
  x2:=strtoint(edit3.Text);
  y2:=strtoint(edit4.Text);
  z1:=strtoint(edit5.Text);
  z2:=strtoint(edit6.Text);
  x:=x1;
  y:=y1;
  z:=z1;
  dx:=(abs(x2-x1));     // длину по заданной координате
  dy:=(abs(y2-y1));
  dz:=(abs(z2-z1));
  if (x2-x1)<=0 then s1:=-1 else s1:=1;   // приращение отрицательное или положительное в зависимости от знака  длины
  if (y2-y1)<=0 then s2:=-1 else s2:=1;
  if (z2-z1)<=0 then s3:=-1 else s3:=1;
  edit7.Clear;
   memo1.Clear;
 
 
 
   if (dy>=dx) and (dy>=dz) then
   begin
       e_yx := (dx-dy) Shl 1;
             e_yz := (dz-dy) Shl 1;
             e_yx := e_yx - (e_yx shr 1);
             e_yz := e_yz - (e_yz shr 1);
 
               for   i:=0 to (dy-1)   do
         begin
            if(e_yx>=0)  then
              begin
              x :=x+  s1;
                        e_yx := e_yx - (dy shl 1);
              end;
                    if(e_yz>=0)  then
                  begin
              z:= z+ s3;
                        e_yz :=e_yz - (dy shl 1);
                      end;
 
                y := y+ s2;
                e_yx := e_yx+ (dx shl 1);
                e_yz :=e_yz + (dz shl 1);
        memo1.lines.add(inttostr(x)+' '+inttostr(y)+' '+inttostr(z));
 
        form1.Canvas.Pixels[x+100,y+100]:=clBlack;
        end;
         edit7.Text:=(('dy'));
 
    end
        else if (dx>=dy) and (dx>=dz)   then
      begin
       e_xy := (dy-dx) Shl 1;
             e_xz := (dz-dx) Shl 1;
             e_xz := e_xz - (e_xz shr 1);
             e_xy := e_xy - (e_xy shr 1);
 
               for   i:=0 to (dx-1)   do
         begin
            if(e_xy>=0)  then
              begin
              y := y + s2;
                        e_xy := e_xy - (dy shl 1);
              end;
                    if(e_xz>=0)  then
                begin
                      z := z+ s3;
                      e_xz :=e_xz - (dy shl 1);
                    end;
 
                x := x+ s1;
                e_xy := e_xy+ (dy shl 1);
                e_xz :=e_xz + (dz shl 1);
       memo1.lines.add(inttostr(x)+' '+inttostr(y)+' '+inttostr(z));
 
        form1.Canvas.Pixels[x+100,y+100]:=clBlack;
        end;
         edit7.Text:=(('dx'));
 
      end
 
    else // (dz>=dy) && (dz>=dx)
      begin
       e_zx := (dy-dx) Shl 1;
             e_zy := (dz-dx) Shl 1;
             e_zx := e_zx - (e_zx shr 1);
             e_zy := e_zy - (e_zy shr 1);
 
               for   i:=0 to (dz-1)   do
         begin
            if(e_zx>=0)  then
              begin
              x := x + s1;
                        e_zx := e_zx - (dz shl 1);
              end;
                    if(e_zy>=0)  then
                begin
                      y := y+ s3;
                      e_zy :=e_zy - (dz shl 1);
                    end;
 
                z := z+ s3;
                e_xz := e_xz+ (dx shl 1);
                e_xy :=e_xy + (dy shl 1);
        memo1.lines.add(inttostr(x)+' '+inttostr(y)+' '+inttostr(z));
 
        form1.Canvas.Pixels[x+100,y+100]:=clBlack;
        end;
         edit7.Text:=(('dz'));
 
      end;
но выдает "что то не то". наверняка напутал с такими вещами как
C++
1
2
int sx = MGML_MATH::SIGN(p2.x-x);
e_zx +=(dx << 1);
подскажите что конкретно и эти строчки значат и как их в делфи перевести правильно( я уже прочитал и перевел по своему разумению)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2015, 17:49
Ответы с готовыми решениями:

Проверьте корректность формулы
В оценке рисков предприятия для окружающей среды предложена формула \frac{dP}{dX}=0;...

Проверить корректность перевода кода с Pascal
Здравствуйте, помогите проверить, правильно ли перевел код, результаты почему-то разные код на...

Проверьте корректность вычисления суммы
Задание: вычислить с точностью \varepsilon= {10}^{-5} сумму...

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

2
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,631
Записей в блоге: 1
30.03.2015, 18:35 2
Может лучше перенести в раздел delphi?
0
0 / 0 / 1
Регистрация: 11.04.2013
Сообщений: 138
Записей в блоге: 1
30.03.2015, 20:10  [ТС] 3
удалите пожалуйста тему.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2015, 20:10
Помогаю со студенческими работами здесь

Проверьте корректность работы кода
#include &lt;conio.h&gt; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;stdio.h&gt; #define b 15 ...

Проверьте корректность вычислений программой
Всем привет! Посмотрите пожалуйста правильно ли все работает 'Объявление глобального массива...

Сети и подсети проверьте записи на корректность
Неотъемлемое правило маршрутизации – «Указанный Шлюз и IP-адрес ИСХОДНОГО узла (на котором ...

Алгоритм Брезенхема
Есть такой цикл и это кусок кода из этой статьи for (int x = x0; x &lt;= x1; x++) { ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru