Алгоритм Брезенхема. Проверьте корректность перевода (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
|