Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

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

30.03.2015, 17:49. Просмотров 372. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2015, 17:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Алгоритм Брезенхема. Проверьте корректность перевода (C++ -> Delphi) (C++):

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

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

Алгоритм Брезенхема построения окружности на С++ - C++
помогите найти или написать программу алгоритм Брезенхема построения окружности на С++ для Borland 3.1 ПЛИЖ):huh::umnik:

Алгоритм Брезенхема для разложения отрезка в растр - C++
помогите разобраться с этим алгоритмом, перечитал много сайтов, но че то никак не врублюсь, вот как этот коэфициент отклонения высчитывать?...

Алгоритм перевода чисел - C++
Помогите пожалуйста! Надо мне написать алгоритм перевода из десятичного числа в 16 ричное число! Через стандартные функции не катит,и...

Алгоритм перевода чисел - C++
Парни,напишите пожалуйста програмный алгоритм перевода чисел из 10 ричной системы счисления в 16 ричную систему. Очень надо.

2
Croessmah
Ушел
13777 / 8027 / 926
Регистрация: 27.09.2012
Сообщений: 19,777
Записей в блоге: 3
Завершенные тесты: 1
30.03.2015, 18:35 #2
Может лучше перенести в раздел delphi?
0
aypinki2
0 / 0 / 0
Регистрация: 11.04.2013
Сообщений: 138
Записей в блоге: 1
30.03.2015, 20:10  [ТС] #3
удалите пожалуйста тему.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2015, 20:10
Привет! Вот еще темы с ответами:

Алгоритм перевода двумерного массива в одномерный - C++
Доброй ночи, Форумчане! У меня есть вопросы по заданию. Задание я выполнил, программа работает, всё правильно выводит. Думаю, сейчас сдам!...

Алгоритм перевода между системами счисления - C++
Привет. Есть две функции на Delphi которые позволяют переводить числа из любых систем счисления. Из-за низнание языка С++ (я Дельфин), не...

Алгоритм перевода шестнадцатеричного числа в десятичный код - C++
помогите написать программу &quot;алгоритм перевода шестнадцатиличного числа в десятичный код&quot;

Разработать алгоритм перевода двоичных чисел в десятичные числа - C++
разработать алгоритм перевода двоичных чисел в десятичные числа


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

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

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