Saturday, October 17, 2015

Pascal graphics trees and houses, рисуем домики и деревья случайным образом на паскале





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
  1. uses
  2.   WinCRT, domik_elements;
  3. var
  4.   x, y, l, i, n, k: integer;
  5. begin
  6.   randomize;
  7.   GrOn;
  8.   k:= random(8)+4;
  9.   Street(k);
  10.   for i:=1 to 10 do begin
  11.     x:= random(700);
  12.     y:= random(400)+50;
  13.     l:= random(80)+30;
  14.     n:= random(3);
  15.     Tree(x,y,l,n,random(8)+8);
  16.   end;
  17.   for i:=1 to 1 do begin
  18.     x:= random(700);
  19.     y:= random(400)+50;
  20.     l:= random(30)+20;
  21.     Cat(x,y,l,random(8)+8);
  22.   end;
  23.   readkey;
  24.   GrOff
  25. end.

domik_elements.pas
  1. unit domik_elements;
  2. interface
  3. uses graph;
  4. procedure Street(k: integer);
  5. procedure Cat(x,y,l,c: integer);
  6. procedure Tree(x,y,l,n,c: integer);
  7. procedure Domic(x,y,l,c: integer);
  8. procedure GrOn;
  9. procedure GrOff;
  10. implementation
  11. procedure GrOn;
  12. var
  13.   gd,gm: integer;
  14. begin
  15.   gd:= detect;
  16.   InitGraph(gd,gm,'')
  17. end;
  18. procedure GrOff;
  19. begin
  20.   CloseGraph
  21. end;
  22. procedure Street(k: integer);
  23. var
  24.   i,x,y,l: integer;
  25. begin
  26.   x:= 10;
  27.   y:= random(200)+100;
  28.   for i:=1 to k do begin
  29.     l:= random(40)+30;
  30.     Domic(x,y,l,random(10)+2);
  31.     x:= x+l+ l div 3;
  32.   end;
  33. end;
  34. procedure Domic(x,y,l,c: integer);
  35. begin
  36. // Walls
  37.   setcolor(c);
  38.   line(x,y,x,y-l);
  39.   line(x,y,x+l,y);
  40.   line(x,y-l,x+l,y-l);
  41.   line(x+l,y,x+l,y-l);
  42. // Roof
  43.   line(x,y-l,(2*x+l) div 2, y-l-(div 2));
  44.   line(x+l,y-l,(2*x+l) div 2, y-l-(div 2));
  45. // Window
  46.   circle(x+div 2,y-div 2,div 5);
  47. end;
  48. procedure Tree(x,y,l,n,c: integer);
  49. var
  50.   i, d, d1, d2: integer;
  51. begin
  52. // Trunk
  53.   setcolor(c);
  54.   line(x+l+div 2,y,x+l+div 2,y+l-1);
  55.   line(x+l+div 3,y,x+l+div 3,y+l-1);
  56. // Branches
  57.   c:= 0;
  58.   c:= random(10)+2;
  59.   d:= 0;
  60.   for i:=1 to (div 9) do begin
  61.     d1:= random(360)+1;
  62.     d2:= random(360)+1;
  63.     d:= d+3;
  64.     setcolor(c);
  65.     circle(((x+l+div 2)+(x+l+div 3)) div 2,y,d);
  66. // Add branches
  67.     if n=2 then begin
  68.       circle(x+(l+div 2)+div 3,y+div 3,div 2);
  69.       circle(x+(l+div 2)-div 2,y+div 3,div 2);
  70.       line(x+l+div 2,y+div 2,x+(l+div 2)+div 3,y+div 3);
  71.       line(x+l+div 3,y+div 2,x+(l+div 2)-div 2,y+div 3);
  72.     end;
  73.   end;
  74. end;
  75. procedure Cat(x,y,l,c: integer);
  76. begin
  77.   setcolor(c);
  78.   line(x,y,x,y+l);
  79.   line(x,y,x+l,y);
  80.   line(x+l,y,x+l,y+l);
  81.   line(x,y+div 2,x+l,y+div 2);
  82.   line(x,y,x-div 2,y-div 2);
  83.   circle(x+l+div 10,y-div 4,div 4);
  84. end;
  85. begin
  86. end.

Примеры:




Скачать download исходный код


No comments:

Post a Comment