Advertisement
Guest User

Untitled

a guest
Jun 23rd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 11.86 KB | None | 0 0
  1. procedure TALEForm.Grass(polyn:integer; NV, NV2:TRPoint; GHeight:double; Smoothing, CorrectREdge, GWidth:boolean);
  2. var
  3.   maxx: integer;
  4.   i, j: integer;
  5.   Pol: TPolygon;
  6.   IsCreating: boolean;
  7.   RightOrient, RightSlope: boolean;
  8.   Modif: boolean;
  9.   istart, iend, im1, ip1, l:integer;
  10.   v1, v2, v: TRPoint;
  11.   coss, sins, tmp: double;
  12.   startheight, endheight, wh: double;
  13.  
  14. function GetBVector(v1, v2: TRPoint): TRPoint;
  15.   var
  16.     v: TRPoint;
  17.     cosa: double;
  18.   begin
  19.     Level.Normalize(v1);
  20.     Level.Normalize(v2);
  21.     v.x := v1.x+v2.x;
  22.     v.y := v1.y+v2.y;
  23.     Level.Normalize(v);
  24.     if (v.x = 0) and (v.y = 0) then begin
  25.       //Âåêòîðû ïàðàëëåëüíû
  26.       v.x := v1.y;
  27.       v.y := -v1.x;
  28.     end;
  29.     if v.y<0 then begin
  30.       //Íàäî âíèç, à íå ââåðõ
  31.       v.x := -v.x;
  32.       v.y := -v.y;
  33.     end;
  34.     cosa := v1.x*v.x+v1.y*v.y;
  35.     cosa := sqrt(1-cosa*cosa);
  36.     if cosa<>0 then begin
  37.       v.x := v.x/cosa;
  38.       v.y := v.y/cosa;
  39.     end else begin Level.AddMessage(Format(MessageString[63], [0]), iWarning) end;
  40.     //Grass error 0 - âåêòîðû ïàðàëëåëüíû
  41.     //ïî èäåå, íå áûâàåò
  42.     Result := v;
  43.   end;
  44. begin
  45.   with Level do begin
  46.     if not FullTopChecked then begin CheckTopology(NV, true) end;
  47.     l := Length(Polygons[polyn].Vertices);
  48.     //MasSlope - tg
  49.     //Íàéäåì sin è cos
  50.     sins := MaxSlope/sqrt(sqr(MaxSlope)+1);
  51.     coss := sqrt(1-sqr(sins));
  52.     maxx := 0;
  53.     for i := 1 to l-1 do begin if Polygons[polyn].Vertices[maxx].x<Polygons[polyn].Vertices[i].x then begin maxx := i end end;
  54.     i := maxx;
  55.     IsCreating := true;
  56.     Pol.Grass := 1;
  57.     SetLength(Pol.Vertices, 0);
  58.     Modif := false;
  59.     istart := i;
  60.     repeat
  61.       //Äîáàâëåíèå âåðøèíû
  62.       if IsCreating then begin
  63.         SetLength(Pol.Vertices, Length(Pol.Vertices)+1);
  64.         Pol.Vertices[High(Pol.Vertices)] := Polygons[polyn].Vertices[i];
  65.         with Pol.Vertices[High(Pol.Vertices)] do begin if GWidth then begin
  66.             im1 := (i-1+l) mod l;
  67.             ip1 := (i+1) mod l;
  68.             v1.x := Polygons[polyn].Vertices[i].x-Polygons[polyn].Vertices[im1].x;
  69.             v1.y := Polygons[polyn].Vertices[i].y-Polygons[polyn].Vertices[im1].y;
  70.             v2.x := Polygons[polyn].Vertices[i].x-Polygons[polyn].Vertices[ip1].x;
  71.             v2.y := Polygons[polyn].Vertices[i].y-Polygons[polyn].Vertices[ip1].y;
  72.             v := GetBVector(v1, v2);
  73.  
  74.             x := x+v.x*GHeight;
  75.             y := y+v.y*GHeight;
  76.           end else begin y := y+GHeight end end;
  77.       end;
  78.       NV := Polygons[polyn].Vertices[(i+1) mod l];
  79.       RightOrient := (Polygons[polyn].Vertices[i].x>NV.x);
  80.       RightSlope := (abs(Polygons[polyn].Vertices[i].x-NV.x)>MaxSlope*abs(Polygons[polyn].Vertices[i].y-NV.y));
  81.       if not (RightOrient and RightSlope) then begin
  82.         //Ñâåðòûâàíèå
  83.         if IsCreating then begin
  84.           iend := i;
  85.           if Length(Pol.Vertices)>=2 then begin
  86.             startheight := GHeight;
  87.             endheight := GHeight;
  88.             //Íà êðàÿõ ðîâíî âíèç
  89.             if GWidth then begin
  90.               //Åñëè íå "ãëàäêî"
  91.               if (Pol.Vertices[1].x<Polygons[polyn].Vertices[istart].x) or (Length(Pol.Vertices) = 2) then begin
  92.                 ip1 := (istart+1) mod l;
  93.                 v1.x := Polygons[polyn].Vertices[istart].x-Polygons[polyn].Vertices[ip1].x;
  94.                 v1.y := Polygons[polyn].Vertices[istart].y-Polygons[polyn].Vertices[ip1].y;
  95.                 v2.x := -v1.x;
  96.                 v2.y := v1.y;
  97.                 v := GetBVector(v1, v2);
  98.                 Pol.Vertices[0].x := Polygons[polyn].Vertices[istart].x+v.x*GHeight;
  99.                 Pol.Vertices[0].y := Polygons[polyn].Vertices[istart].y+v.y*GHeight;
  100.                 startheight := v.y*GHeight;
  101.               end;
  102.  
  103.               if (Pol.Vertices[High(Pol.Vertices)-1].x>Polygons[polyn].Vertices[iend].x) or (Length(Pol.Vertices) = 2) then begin
  104.                 im1 := (iend-1+l) mod l;
  105.                 v2.x := Polygons[polyn].Vertices[iend].x-Polygons[polyn].Vertices[im1].x;
  106.                 v2.y := Polygons[polyn].Vertices[iend].y-Polygons[polyn].Vertices[im1].y;
  107.                 v1.x := -v2.x;
  108.                 v1.y := v2.y;
  109.                 v := GetBVector(v1, v2);
  110.                 Pol.Vertices[High(Pol.Vertices)].x := Polygons[polyn].Vertices[iend].x+v.x*GHeight;
  111.                 Pol.Vertices[High(Pol.Vertices)].y := Polygons[polyn].Vertices[iend].y+v.y*GHeight;
  112.                 endheight := v.y*GHeight;
  113.               end;
  114.             end;
  115.             if not Smoothing then begin if Length(Pol.Vertices) = 2 then begin
  116.                 SetLength(Pol.Vertices, 3);
  117.                 Pol.Vertices[2].x := (Pol.Vertices[0].x+Pol.Vertices[1].x)/2;
  118.                 Pol.Vertices[2].y := (Pol.Vertices[0].y+Pol.Vertices[1].y)/2;
  119.               end end;
  120.             //Êîððåêòèðîâêà çàõîäà íà ñëåäóþùóþ ãðàíü
  121.             //Left
  122.             if (Polygons[polyn].Vertices[iend].x<Polygons[polyn].Vertices[(iend+1) mod l].x) then begin
  123.               NV.x := -(Polygons[polyn].Vertices[iend].x-Polygons[polyn].Vertices[(iend-1+l) mod l].x);
  124.               NV.y := -(Polygons[polyn].Vertices[iend].y-Polygons[polyn].Vertices[(iend-1+l) mod l].y);
  125.               NV2.x := -(Polygons[polyn].Vertices[iend].x-Polygons[polyn].Vertices[(iend+1) mod l].x);
  126.               NV2.y := -(Polygons[polyn].Vertices[iend].y-Polygons[polyn].Vertices[(iend+1) mod l].y);
  127.               if (NV.x*NV2.y-NV.y*NV2.x)<0 then begin
  128.                 //Òðàâà çàõîäèò çà ñëåä. ãðàíü
  129.                 if (NV.x<>0) and (NV2.x<>0) then begin
  130.                   if Smoothing then begin wh := WheelHeight end else begin wh := WheelHeight-(Pol.Vertices[High(Pol.Vertices)].y-Polygons[polyn].Vertices[iend].y) end;
  131.                   tmp := -wh/(NV2.y/NV2.x-NV.y/NV.x);
  132.                   if tmp<0 then begin tmp := 0 end;
  133.                 end else begin
  134.                   //Íå ïîâåçëî - ïîñëåäíÿÿ ñòîðîíà=0
  135.                   tmp := 0;
  136.                   Level.AddMessage(Format(MessageString[63], [1]), iWarning);
  137.                 end;
  138.                 if (tmp<NV.x) then begin
  139.                   Pol.Vertices[High(Pol.Vertices)].x := Pol.Vertices[High(Pol.Vertices)].x+tmp;
  140.                   Pol.Vertices[High(Pol.Vertices)].y := Pol.Vertices[High(Pol.Vertices)].y+tmp*NV.y/NV.x;
  141.                 end else begin
  142.                   //Óäàëÿåì ïîñëåäíþþ âåðøèíó
  143.                   SetLength(Pol.Vertices, High(Pol.Vertices));
  144.                   AddMessage(Format(MessageString[63], [2]), iWarning);
  145.                 end;
  146.               end;
  147.             end;
  148.             //Right
  149.             if (Polygons[polyn].Vertices[istart].x>Polygons[polyn].Vertices[(istart+1) mod l].x) then begin
  150.               NV2.x := -(Polygons[polyn].Vertices[istart].x-Polygons[polyn].Vertices[(istart-1+l) mod l].x);
  151.               NV2.y := -(Polygons[polyn].Vertices[istart].y-Polygons[polyn].Vertices[(istart-1+l) mod l].y);
  152.               NV.x := -(Polygons[polyn].Vertices[istart].x-Polygons[polyn].Vertices[(istart+1) mod l].x);
  153.               NV.y := -(Polygons[polyn].Vertices[istart].y-Polygons[polyn].Vertices[(istart+1) mod l].y);
  154.               if (NV.x*NV2.y-NV.y*NV2.x)>0 then begin
  155.                 //Òðàâà çàõîäèò çà ñëåä. ãðàíü
  156.                 if (NV.x<>0) and (NV2.x<>0) then begin
  157.                   if Smoothing then begin wh := WheelHeight end else begin wh := WheelHeight-(Pol.Vertices[0].y-Polygons[polyn].Vertices[istart].y) end;
  158.                   tmp := wh/(NV2.y/NV2.x-NV.y/NV.x);
  159.                   if tmp<0 then begin tmp := 0 end;
  160.                 end else begin
  161.                   //Íå ïîâåçëî - ïîñëåäíÿÿ ñòîðîíà=0
  162.                   tmp := 0;
  163.                   AddMessage(Format(MessageString[63], [1]), iWarning);
  164.                 end;
  165.                 if (tmp<-NV.x) then begin
  166.                   Pol.Vertices[0].x := Pol.Vertices[0].x-tmp;
  167.                   Pol.Vertices[0].y := Pol.Vertices[0].y-tmp*NV.y/NV.x;
  168.                 end else begin
  169.                   //Óäàëÿåì ïîñëåäíþþ âåðøèíó
  170.                   for j := 0 to High(Pol.Vertices)-1 do begin Pol.Vertices[j] := Pol.Vertices[j+1] end;
  171.                   SetLength(Pol.Vertices, High(Pol.Vertices));
  172.                   AddMessage(Format(MessageString[63], [2]), iWarning);
  173.                 end;
  174.               end;
  175.             end;
  176.             //Êîððåêòèðîâêà ïðàâîãî êðàÿ
  177.             if CorrectREdge then begin
  178.               Pol.Vertices[0].x := Pol.Vertices[0].x-MaxGrassWidth;
  179.             end;
  180.             //Íåáîëüøîå ñóæåíèå êðàåâ
  181.             Pol.Vertices[0].x := Pol.Vertices[0].x-1e-7;
  182.             Pol.Vertices[High(Pol.Vertices)].x := Pol.Vertices[High(Pol.Vertices)].x+1e-7;
  183.             //Ñãëàæèâàíèå
  184.             if Smoothing then begin
  185.               SetLength(Pol.Vertices, Length(Pol.Vertices)+2);
  186.               //Right
  187.               v.x := Pol.Vertices[1].x-Pol.Vertices[0].x;
  188.               v.y := Pol.Vertices[1].y-Pol.Vertices[0].y;
  189.               Normalize(v);
  190.               v1 := v;
  191.               v.x := v1.x*coss+v1.y*sins;
  192.               v.y := v1.y*coss-v1.x*sins;
  193.               v.x := v.x/sins*GHeight;
  194.               v.y := v.y/sins*GHeight;
  195.               if not GWidth then begin
  196.                 tmp := v1.x/v1.y/sqrt(sqr(v1.x/v1.y)+1);
  197.                 v.x := v.x*tmp;
  198.                 v.y := v.y*tmp;
  199.               end;
  200.               if v.x>0 then begin
  201.                 v.x := -v.x;
  202.                 v.y := -v.y;
  203.               end;
  204.               Pol.Vertices[High(Pol.Vertices)].x := Pol.Vertices[0].x;
  205.               Pol.Vertices[High(Pol.Vertices)].y := Pol.Vertices[0].y-startheight-GHeight*0.01;
  206.               Pol.Vertices[0].x := Pol.Vertices[0].x+v.x;
  207.               Pol.Vertices[0].y := Pol.Vertices[0].y-startheight+v.y;
  208.  
  209.               //Left
  210.               v.x := Pol.Vertices[High(Pol.Vertices)-3].x-Pol.Vertices[High(Pol.Vertices)-2].x;
  211.               v.y := Pol.Vertices[High(Pol.Vertices)-3].y-Pol.Vertices[High(Pol.Vertices)-2].y;
  212.               Normalize(v);
  213.               v1 := v;
  214.               v.x := v1.x*coss-v1.y*sins;
  215.               v.y := v1.y*coss+v1.x*sins;
  216.               v.x := v.x/sins*GHeight;
  217.               v.y := v.y/sins*GHeight;
  218.               if not GWidth then begin
  219.                 tmp := v1.x/v1.y/sqrt(sqr(v1.x/v1.y)+1);
  220.                 v.x := v.x*tmp;
  221.                 v.y := v.y*tmp;
  222.               end;
  223.               if v.x<0 then begin
  224.                 v.x := -v.x;
  225.                 v.y := -v.y;
  226.               end;
  227.               Pol.Vertices[High(Pol.Vertices)-1].x := Pol.Vertices[High(Pol.Vertices)-2].x;
  228.               Pol.Vertices[High(Pol.Vertices)-1].y := Pol.Vertices[High(Pol.Vertices)-2].y-endheight-GHeight*0.01;
  229.               Pol.Vertices[High(Pol.Vertices)-2].x := Pol.Vertices[High(Pol.Vertices)-2].x+v.x;
  230.               Pol.Vertices[High(Pol.Vertices)-2].y := Pol.Vertices[High(Pol.Vertices)-2].y-endheight+v.y;
  231.  
  232.   {                Pol.Vertices[High(Pol.Vertices)-1]:=Pol.Vertices[High(Pol.Vertices)-2];
  233.         Pol.Vertices[High(Pol.Vertices)-1].y:=Pol.Vertices[High(Pol.Vertices)-1].y-GHeight*1.2;
  234.         Pol.Vertices[High(Pol.Vertices)-2].x:=Pol.Vertices[High(Pol.Vertices)-2].x+0.2;}
  235.             end;
  236.             //---
  237.             if not Modif then begin
  238.               Modif := true;
  239.               Modified := true;
  240.             end;
  241.             AddPolygon(Pol);
  242.           end;
  243.           SetLength(Pol.Vertices, 0);
  244.           IsCreating := false;
  245.         end;
  246.       end else begin
  247.         if not IsCreating then begin
  248.           dec(i);
  249.           IsCreating := true;
  250.           istart := i+1;
  251.         end;
  252.       end;
  253.       inc(i);
  254.       i := i mod l;
  255.     until (i = maxx);
  256.   end;
  257. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement