Продолжаю писать код так, как считаю нужным.
Проект в целом, к Lazarus спрятан под спойлером.
В строку ввода вводить целочисленный угол от 0 до 45 градусов.
Работа кода заключается в том, что он пишет трассировку пути по параллельным линиям расположенным под углом, введённым в строку, на поле 45 на 45 клеток. В каждой ячейке он прописывает координаты ячейки где был до неё, и в каждом началеновой линии - единицу в поле записи boolean, а следующий по этой карте трассировки по этим данным узнает в какую клетку ему следовать, и соответственно по единице о том, что линия закончена.
Кликните здесь для просмотра всего текста
| Pascal | 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
| unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Grids, StdCtrls, Math;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
type
tracerRec = record
ix:integer;
yg:integer;
bool:boolean;
end;
var
TtracerRec:tracerRec;
Tracersloi: array of array of array of tracerRec;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);/////////////////////////////////////////////////////////////////////////////////////////////
procedure Step1;
var
v,p:pointer;
y,step,stepF,s,x, sl, fi1, fi, ri1, ri, BasiY, MyCount:integer;
px,py:^integer;
Biger, FcountPix, countPix, FcountPix1, CaTanDegP:integer;
CaTanDeg,TanDeg, deg:Extended;
second_run:boolean;
label l0,l1,l2,l3,l5,l6;//,l4
label t1,t2;
label v1,v2;
begin
deg:= StrToInt(Edit1.Text);
step:=0;
for s:=1 to 1 do begin
TanDeg := Tan(DegToRad(deg));
if TanDeg = 0 then begin
CaTanDeg:=28;
CaTanDegP:=Trunc(CaTanDeg);
px:=@x;
py:=@y;
FcountPix:=0;
FcountPix1:=0;
end
else begin
CaTanDeg:= 1/TanDeg;
if CaTanDeg>=TanDeg then begin
px:=@x;
py:=@y;
CaTanDegP:=Trunc(CaTanDeg);
if CaTanDegP>28 then CaTanDegP:=27;
end
else begin
px:=@y;
py:=@x;
CaTanDegP:=Trunc(CaTanDeg);
if CaTanDegP>28 then CaTanDegP:=27;
end;
end;
if CaTanDegP=0 then begin
fi:=0;
FcountPix:=0;
FcountPix1:=0;
end else begin
fi:=Trunc(28 div CaTanDegP);
FcountPix:=28-step*CaTanDegP;
FcountPix1:=28-fi*CaTanDegP;
end;
stepF:=fi;
fi1:= 27+fi;
BasiY:=0;
repeat
v:=@v1;
ri:=0;
x:=27;
y:=BasiY;
step:=1;
TtracerRec.bool:=true;
second_run := true;
p:=@l1;
if BasiY>27 then begin
step:= BasiY-27+1;
x:=27-(step-1)*CaTanDegP;
y:=27;
ri:=0;
end;
t1:
FcountPix:=28-(step*CaTanDegP);
ri1:=BasiY-fi;
if (FcountPix1>=1) then begin
stepF:=fi;
end;
if ri1<0 then begin
ri:= ri1*CaTanDegP+1;
end;
Biger:=FcountPix;
l0:
/////vbnvn
repeat
StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');// StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);//StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//
TtracerRec.ix:=x;
dec(x);
asm
jmp p
end;
l1:
TtracerRec.bool:=false;
p:=@l2;
l2:
TtracerRec.yg:=y;
p:=@l3;
l3:
until Biger > x;
asm
jmp v
end;
v1:
dec(y);
p:=@l2;
inc(step);
if ((FcountPix1-ri)>x) then goto t2;
goto t1;
t2:
if (FcountPix1>0) and (y>=0)then begin
Biger:=0;
v:=@v2;
goto l0;
end;
v2:
if x = -1 then TtracerRec.ix:=0;
inc(BasiY);
until BasiY=fi1;
if (FcountPix1>0) and (y>=0)then begin
x:=FcountPix1-1;
y:=27;
TtracerRec.bool:=true;
p:=@l5;
repeat
StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');// StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);
TtracerRec.ix:=x;
dec(x);
asm
jmp p
end;
l5:
TtracerRec.bool:=false;
TtracerRec.yg:=y;
p:=@l6;
l6:
until 0 > x;
end;
end;
end;
begin
Step1;
end;
end. |
|
В общем с оптимизацией логического начала от строки 56 я решил ничего не делать, хотя в будущем может быть и это будет переписано.
А в остальном вот этот код
| Pascal | 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
| repeat
ri:=0;
x:=27;
y:=BasiY;
step:=1;
TtracerRec.bool:=true;
second_run := true;
p:=@l1;
if BasiY>27 then begin
step:= BasiY-27+1;
x:=27-(step-1)*CaTanDegP;
y:=27;
ri:=0;
end;
repeat
FcountPix:=28-(step*CaTanDegP);
ri1:=BasiY-fi;
if (FcountPix1>=1) then begin
stepF:=fi;
end;
if ri1<0 then begin
ri:= ri1*CaTanDegP+1;
end;
repeat
StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');// StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);//StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//
TtracerRec.ix:=x;
dec(x);
inc(countPix);
asm
jmp p
end;
l1:
TtracerRec.bool:=false;
TtracerRec.yg:=y;
p:=@l2;
l2:
TtracerRec.yg:=y;
until FcountPix > x;
dec(y);
inc(step);
until ((28-fi*CaTanDegP-ri)>x);
if (FcountPix1>0) and (y>=0)then begin
repeat
StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');// StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);
inc(countPix);
TtracerRec.ix:=x;
TtracerRec.yg:=y;
dec(x);
until 0 > x;
end;
if x = -1 then TtracerRec.ix:=0;
inc(BasiY);
until BasiY=fi1; |
|
стал выглядеть теперь вот так:
| Pascal | 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
| repeat
v:=@v1;
ri:=0;
x:=27;
y:=BasiY;
step:=1;
TtracerRec.bool:=true;
second_run := true;
p:=@l1;
if BasiY>27 then begin
step:= BasiY-27+1;
x:=27-(step-1)*CaTanDegP;
y:=27;
ri:=0;
end;
t1:
FcountPix:=28-(step*CaTanDegP);
ri1:=BasiY-fi;
if (FcountPix1>=1) then begin
stepF:=fi;
end;
if ri1<0 then begin
ri:= ri1*CaTanDegP+1;
end;
Biger:=FcountPix;
l0:
/////vbnvn
repeat
StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');// StringGrid1.Cells[1+px^,1+py^]:= IntToStr(countPix);//StringGrid1.Cells[1+px^,1+py^]:= IntToStr(TtracerRec.ix)+','+IntToStr(TtracerRec.yg) +','+BoolToStr(TtracerRec.bool, '1', '0');//
TtracerRec.ix:=x;
dec(x);
asm
jmp p
end;
l1:
TtracerRec.bool:=false;
p:=@l2;
l2:
TtracerRec.yg:=y;
p:=@l3;
l3:
until Biger > x;
asm
jmp v
end;
v1:
dec(y);
p:=@l2;
inc(step);
if ((FcountPix1-ri)>x) then goto t2;
goto t1;
t2:
if (FcountPix1>0) and (y>=0)then begin
Biger:=0;
v:=@v2;
goto l0;
end;
v2:
if x = -1 then TtracerRec.ix:=0;
inc(BasiY);
until BasiY=fi1; |
|
не по правильным правилам заумных челов, но зато есть система, которой я теперь буду придерживаться в остальном:
Если машина производит всегда одни и те-же действия, то действия машины всегда предсказуемы, всегда есть код который добавляется к выполняемой части предсказуемых действиям машины, всегда есть код который исключается из выполняемой части предсказуемого кода.
В целом правила написания кода пока мои такие:
исключать по возможности проверки условий, рассматривать действия системы при любых обстоятельствах как одни и -же, но от ситуации к ситуации с увеличенным или уменьшенным списком действий.
В общем это так, между прочим.
|