yh - уровень горизонта (задаем сами)
y0 - уровень дальности d0 (задаем сами)
y - уровень дальности d (рассчитывается)
L0 - размер изображения предмета, находящегося на дальности d0 (задаем)
L - размер изображения предмета, находящегося на дальности d (рассчитываем)
везде слово "предмет" означает один и тот же предмет, лежащий на земле перпендикулярно линии взгляда
Допустим, надо изобразить предмет, находящийся на дальности d. Расчеты производим исходя из подобия трегольников A0-O-B0 и AOB.
Но сначала заметим, что во сколько раз предмет дальше, во столько раз он кажется меньше. Назовем это отношение k.
L0/L = d/d0 = k
Отсюда сразу получаем: L = L0/k
Это же число k является и коэффициентом подобия треугольников.
(yh-y0)/(yh-y) = k
y = yh - (yh-y0)/k
domik.pas
- uses
- WinCRT, domik_elements;
- var
- x, y, l, i, n, k: integer;
- begin
- randomize;
- GrOn;
- k:= random(8)+4;
- Street(k);
- for i:=1 to 10 do begin
- x:= random(700);
- y:= random(400)+50;
- l:= random(80)+30;
- n:= random(3);
- Tree(x,y,l,n,random(8)+8);
- end;
- for i:=1 to 1 do begin
- x:= random(700);
- y:= random(400)+50;
- l:= random(30)+20;
- Cat(x,y,l,random(8)+8);
- end;
- readkey;
- GrOff
- end.
domik_elements.pas
- unit domik_elements;
- interface
- uses graph;
- procedure Street(k: integer);
- procedure Cat(x,y,l,c: integer);
- procedure Tree(x,y,l,n,c: integer);
- procedure Domic(x,y,l,c: integer);
- procedure GrOn;
- procedure GrOff;
- implementation
- procedure GrOn;
- var
- gd,gm: integer;
- begin
- gd:= detect;
- InitGraph(gd,gm,'')
- end;
- procedure GrOff;
- begin
- CloseGraph
- end;
- procedure Street(k: integer);
- var
- i,x,y,l: integer;
- begin
- x:= 10;
- y:= random(200)+100;
- for i:=1 to k do begin
- l:= random(40)+30;
- Domic(x,y,l,random(10)+2);
- x:= x+l+ l div 3;
- end;
- end;
- procedure Domic(x,y,l,c: integer);
- begin
- // Walls
- setcolor(c);
- line(x,y,x,y-l);
- line(x,y,x+l,y);
- line(x,y-l,x+l,y-l);
- line(x+l,y,x+l,y-l);
- // Roof
- line(x,y-l,(2*x+l) div 2, y-l-(l div 2));
- line(x+l,y-l,(2*x+l) div 2, y-l-(l div 2));
- // Window
- circle(x+l div 2,y-l div 2,l div 5);
- end;
- procedure Tree(x,y,l,n,c: integer);
- var
- i, d, d1, d2: integer;
- begin
- // Trunk
- setcolor(c);
- line(x+l+l div 2,y,x+l+l div 2,y+l-1);
- line(x+l+l div 3,y,x+l+l div 3,y+l-1);
- // Branches
- c:= 0;
- c:= random(10)+2;
- d:= 0;
- for i:=1 to (l div 9) do begin
- d1:= random(360)+1;
- d2:= random(360)+1;
- d:= d+3;
- setcolor(c);
- circle(((x+l+l div 2)+(x+l+l div 3)) div 2,y,d);
- // Add branches
- if n=2 then begin
- circle(x+(l+l div 2)+l div 3,y+l div 3,d div 2);
- circle(x+(l+l div 2)-l div 2,y+l div 3,d div 2);
- line(x+l+l div 2,y+l div 2,x+(l+l div 2)+l div 3,y+l div 3);
- line(x+l+l div 3,y+l div 2,x+(l+l div 2)-l div 2,y+l div 3);
- end;
- end;
- end;
- procedure Cat(x,y,l,c: integer);
- begin
- setcolor(c);
- line(x,y,x,y+l);
- line(x,y,x+l,y);
- line(x+l,y,x+l,y+l);
- line(x,y+l div 2,x+l,y+l div 2);
- line(x,y,x-l div 2,y-l div 2);
- circle(x+l+l div 10,y-l div 4,l div 4);
- end;
- begin
- end.
No comments:
Post a Comment