Advertisement
sek1pa

ConvexHull_notfinished

Jan 19th, 2018
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 2.01 KB | None | 0 0
  1. -module(solution).
  2. -compile(export_all).
  3.  
  4. rotate({A0,A1},{B0,B1},{C0,C1}) ->
  5.         (B0-A0)*(C1-B1)-(B1-A1)*(C0-B0).
  6.  
  7. find_start_point({A,B},[]) -> {A,B};
  8. find_start_point({A,B},[{C,D}|Points]) ->
  9.     if (A < C orelse B < D) -> find_start_point({A,B},Points);
  10.        (A >= C orelse B >= D) -> find_start_point({C,D},Points)
  11.        end.
  12.  
  13. main() ->
  14.     {ok,File}=file:open("test_case",read),
  15.     {ok,Prom}=file:read_line(File),
  16.     [Count,_]=string:split(Prom,"\n"),
  17.     io:format("~s~n",[Count]),
  18.     {ok,Bin}=file:read_file("test_case"),
  19.     [First|Pairs]=binary:split(Bin,[<<"\n">>],[global]),
  20.     Data=parse_bin(Pairs,[]),
  21.     file:close(File),
  22.     main(Data).
  23.    
  24.  
  25. main([{A,B}|Points]) ->
  26.     StartPoint=find_start_point({A,B},Points),
  27.     io:format("SP = ~p~n",[StartPoint]),
  28.     jarvis(StartPoint,lists:reverse([{A,B}|Points])).
  29.  
  30. parse_bin([],List) ->
  31.     List;
  32. parse_bin([Pair|Tail],List) ->
  33.     if Pair == <<>> ->
  34.         parse_bin([],List);
  35.         Pair /= <<>> ->
  36.         [A,B]=binary:split(Pair,[<<" ">>],[global]),
  37.     parse_bin(Tail,[{binary_to_integer(A),binary_to_integer(B)}|List]) end.
  38.    
  39. jarvis(StartPoint,All) ->
  40.     NewList=lists:sort(fun(X,Y)-> Rot=rotate(StartPoint,Y,X), if Rot<0 -> true; Rot>0 -> false; Rot==0 -> false end end,lists:delete(StartPoint,All)),
  41.     prom(NewList,[lists:last(lists:reverse(NewList)),StartPoint]).
  42.  
  43. prom([{Fx,Fy}|List],[{Ax,Ay},{Bx,By}|Tail]) ->
  44.     marvis(List,[{Ax,Ay},{Bx,By}|Tail]).
  45.  
  46. marvis([],[{Ax,Ay},{Bx,By}|Tail]) ->
  47.     Perim=perim({Ax,Ay},lists:last(Tail)),
  48.     perimetr([{Ax,Ay},{Bx,By}|Tail],Perim);
  49.  
  50. marvis([{Fx,Fy}|List],[{Ax,Ay},{Bx,By}|Tail]) ->
  51.     Rot=rotate({Bx,By},{Ax,Ay},{Fx,Fy}),
  52.     if Rot < 0 -> marvis([{Fx,Fy}|List], [{Bx,By}|Tail]);
  53.        Rot > 0 -> marvis(List, [{Fx,Fy},{Ax,Ay},{Bx,By}|Tail]);
  54.        Rot =:= 0 -> marvis(List, [{Ax,Ay},{Bx,By}|Tail])
  55.     end.
  56.  
  57. perimetr([{_,_}],Perim) ->
  58.     io:format("~p~n",[Perim]);
  59. perimetr([{Ax,Ay},{Bx,By}|Tail],Perim) ->
  60.     N = perim({Ax,Ay},{Bx,By}),
  61.     perimetr([{Bx,By}|Tail],Perim+N).
  62.  
  63. perim({Ax,Ay},{Bx,By}) ->
  64.     math:sqrt(math:pow(Bx-Ax,2)+math:pow(By-Ay,2)).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement