% Zeichnen eines verformten Rahmens
%
%  Input:     xy    -  Knotenkoordinaten, entweder Matrix mit zwei Spalten (x, y)
%                      oder Matrix mit einer Spalte (x)
%             km    -  Koinzidenzmatrix                          
%             uvphi -  Knotenverformungen, entweder Matrix mit 3 Spalten (u, v, phi)
%                      oder Matrix mit 2 Spalten (v, phi)
%             kr    -  Matrix der Randbedingungen (2 oder 3 Spalten)
%             fac   -  (optional) Vergroesserungsfaktor fuer Verformungen
%                      (Default: 1)

function drawbeamuv (xy , km , kr , uvphi , fac)

if nargin < 5 fac = 1 ; end
ndsect = 10 ;  % Elemente sind Polygone mit jeweils ndsect+1 Punkten pro Element

[npoints , ncoords] = size (xy)    ;
[npoints , ndisp]   = size (uvphi) ;
[nelems  ,     i]   = size (km)    ;

minx = 0 ;
maxx = 0 ;
miny = 0 ;
maxy = 0 ;

for ie=1:nelems
  nd1 = km(ie,1) ;
  nd2 = km(ie,2) ;

  if ncoords < 2
    y1 = 0 ;
    y2 = 0 ;
  else
    y1 = xy(nd1,2) ;
    y2 = xy(nd2,2) ;
  end

  x1 = xy(nd1,1) ;
  x2 = xy(nd2,1) ;

  if ndisp < 3
    u1   = 0 ;
    u2   = 0 ;
    v1   = uvphi(nd1,1) ;
    v2   = uvphi(nd2,1) ;
    phi1 = uvphi(nd1,2) ;
    phi2 = uvphi(nd2,2) ;
  else
    u1   = uvphi(nd1,1) ;
    u2   = uvphi(nd2,1) ;
    v1   = uvphi(nd1,2) ;
    v2   = uvphi(nd2,2) ;
    phi1 = uvphi(nd1,3) ;
    phi2 = uvphi(nd2,3) ;
  end

  L  = sqrt ((x2-x1)^2 + (y2-y1)^2) ;
  if L > 0
    sa  = (y2-y1)/L ;
    ca  = (x2-x1)/L ;
  
    u1q   = ( u1*ca + v1*sa) * fac ;
    v1q   = (-u1*sa + v1*ca) ;
    u2q   = ( u2*ca + v2*sa) * fac ;
    v2q   = (-u2*sa + v2*ca) ;
    phi1q = phi1 ;
    phi2q = phi2 ;
  
    Lq  = L + u2q - u1q ;
  
    xd = zeros (ndsect+1,1) ;
    yd = zeros (ndsect+1,1) ;

    xdL = 0 ;
    dx  = 1/ndsect ;
    for i=1:ndsect+1
      xq = xdL * Lq ;
      vq = (v1q*(1-3*xdL^2+2*xdL^3) + phi1q*(xdL-2*xdL^2+xdL^3)*Lq + ...
            v2q*(  3*xdL^2-2*xdL^3) + phi2q*(     -xdL^2+xdL^3)*Lq) * fac ;
      xd(i) = x1 + (u1q+xq)*ca - vq*sa ;
      yd(i) = y1 + (u1q+xq)*sa + vq*ca ;
      xdL   = xdL + dx ;
    end
    
    minx = min ([minx ; xd]) ;
    maxx = max ([maxx ; xd]) ;
    miny = min ([miny ; yd]) ;
    maxy = max ([maxy ; yd]) ;
    plot (xd , yd) ;
    hold on ;
  end
end  % Schleife ueber alle Elemente

ranx = (maxx-minx)*0.2 ;
rany = (maxy-miny)*0.2 ;
axis ([minx-ranx maxx+ranx miny-rany maxy+rany]) ;
axis equal ;

lagh = (ranx+rany)/6 ;
minr = min(ranx,rany)*1.5 ;

% Lager:
for i=1:npoints
    ilag = 0 ;
    if ndisp < 3
       if kr(i,1) == 1
           ilag = 1 ;        % Loslager vertikal
           if kr(i,2) == 1  
               ilag = 6 ;    % Einspannung horizontal links (vermutet)
           end
       end
    else
       if kr(i,2) == 1
           ilag = 1 ;        % Loslager vertikal
           if kr(i,1) == 1  
               ilag = 4 ;    % Festlager
               if kr(i,3) == 1
                   ilag = 6 ;  % Einspannung
               end
           end
       else
           if kr(i,1) == 1
               ilag = 2 ;    % Loslager horizontal links (vermutet)
           end
       end
    end
    
    for j=1:nelems
            if km(j,1) == i || km(j,2) == i
                xlag = xy(km(j,1),1) ;
                xrem = xy(km(j,2),1) ;
                if ncoords < 2
                    ylag = 0 ;
                    yrem = 0 ;
                else
                    ylag = xy(km(j,1),2) ;
                    yrem = xy(km(j,2),2) ;
                end
                if km(j,2) == i
                    xsav = xlag ;
                    xlag = xrem ;
                    xrem = xsav ;
                    ysav = ylag ;
                    ylag = yrem ;
                    yrem = ysav ;
                end
                if ilag == 2
                    if xrem < xlag
                        ilag = 3 ;    %  Loslager horizontal rechts
                    end
                elseif ilag == 6
                    if abs(xrem-xlag) > abs(yrem-ylag)
                        if xrem < xlag
                            ilag = 7 ;  % Einspannung vertikal rechts
                        end
                    else
                        if yrem > ylag
                            ilag = 8 ;  % Einspannung vertikal unten
                        else
                            ilag = 9 ;  % Einspannung vertikal oben
                        end
                    end
                end
                break ;
            end % if km(j,1) == i || km(j,2) == i
    end     % for ...
    
    if (ilag == 1 || ilag == 4) 
       fill ([xlag xlag+lagh/1.7 xlag-lagh/1.7], ...
             [ylag ylag-lagh ylag-lagh] , 'b') ;
       hold on ;
       if (ilag == 1) 
          plot ([xlag+lagh/1.7 xlag-lagh/1.7], ...
                [ylag-lagh*1.2 ylag-lagh*1.2] , '-k') ;
       end
       hold on ;
    elseif (ilag == 2) 
       fill ([xlag xlag-lagh xlag-lagh], ...
             [ylag ylag-lagh/1.7 ylag+lagh/1.7] , 'b') ;
       hold on ;
       plot ([xlag-lagh*1.2 xlag-lagh*1.2], ...
             [ylag-lagh/1.7 ylag+lagh/1.7] , '-k') ;
       hold on ;
    elseif (ilag == 3) 
       fill ([xlag xlag+lagh xlag+lagh], ...
             [ylag ylag-lagh/1.7 ylag+lagh/1.7] , 'b') ;
       hold on ;
       plot ([xlag+lagh*1.2 xlag+lagh*1.2], ...
             [ylag-lagh/1.7 ylag+lagh/1.7] , '-k') ;
       hold on ;
    elseif (ilag == 6) 
       fill ([xlag          xlag-lagh*0.7 xlag-lagh*0.7 xlag         ] , ...
             [ylag+lagh*1.3 ylag+lagh*1.3 ylag-lagh*1.3 ylag-lagh*1.3] , 'b') ;
       hold on ;
    elseif (ilag == 7) 
       fill ([xlag          xlag+lagh*0.7 xlag+lagh*0.7 xlag         ] , ...
             [ylag+lagh*1.3 ylag+lagh*1.3 ylag-lagh*1.3 ylag-lagh*1.3] , 'b') ;
       hold on ;
    elseif (ilag == 8) 
       fill ([xlag+lagh*1.3 xlag+lagh*1.3 xlag-lagh*1.3 xlag-lagh*1.3] , ...
             [ylag          ylag-lagh*0.7 ylag-lagh*0.7 ylag         ] , 'b') ;
       hold on ;
    elseif (ilag == 9) 
       fill ([xlag+lagh*1.3 xlag+lagh*1.3 xlag-lagh*1.3 xlag-lagh*1.3] , ...
             [ylag          ylag+lagh*0.7 ylag+lagh*0.7 ylag         ] , 'b') ;
       hold on ;
    end 
end
