Advertisement
sek1pa

Convexhull_h

Jan 21st, 2018
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 1.94 KB | None | 0 0
  1. -module(solution).
  2. -export([main/0]).
  3.  
  4. rotate({A0,A1},{B0,B1},{C0,C1}) ->
  5.     if(C0<A0 andalso C0<B0) -> ((B0-A0)*(C1-B1)-(B1-A1)*(C0-B0));
  6.     true -> (B0-A0)*(C1-B1)-(B1-A1)*(C0-B0)
  7.         end.
  8.  
  9. find_start_point([{A,B}|[]]) -> {A,B};
  10. find_start_point([{A,B},{C,D}|Points]) ->
  11.     if (A < C orelse B < D) -> find_start_point([{A,B}|Points]);
  12.        (A >= C orelse B >= D) -> find_start_point([{C,D}|Points])
  13.        end.
  14.  
  15. sort_list(StartPoint,All) ->
  16.     lists:sort(fun(X,Y)-> Rot=rotate(StartPoint,X,Y), if Rot<0 -> false; Rot>0 -> true; Rot==0 -> false end end,All).
  17.  
  18. main() ->
  19.     {ok,[Count]}=io:fread("","~d"),
  20.     {PPoints,StartPoint}=read_data(Count,[]),
  21.     Prom=lists:delete(StartPoint,PPoints),
  22.     Points=sort_list(StartPoint,Prom),
  23.     SortedData=lists:delete(lists:nth(1,Points),Points),
  24.     %%io:format("SortedList: ~p~nsecond: ~p~n",[SortedData,lists:nth(1,SortedData)]),
  25.     marvis(SortedData,[lists:nth(1,Points),StartPoint]).
  26.  
  27. read_data(Count,Acc) when Count /=0 ->
  28.     {ok,[A,B]}=io:fread("","~d~d"),
  29.     read_data(Count-1,[{A,B}|Acc]);
  30. read_data(Count,Acc) when Count==0 ->
  31.     {lists:reverse(Acc),find_start_point(Acc)}.
  32.    
  33. marvis([],[{Ax,Ay},{Bx,By}|Tail]) ->
  34.     io:format("~p~p~p~n",[{Ax,Ay},{Bx,By},Tail]),
  35.     Perim=perim({Ax,Ay},lists:last(Tail)),
  36.     perimetr(lists:reverse([{Ax,Ay},{Bx,By}|Tail]),Perim);
  37.  
  38. marvis([{Fx,Fy}|List],[{Ax,Ay},{Bx,By}|Tail]) ->
  39.     Rot=rotate({Bx,By},{Ax,Ay},{Fx,Fy}),
  40.     if Rot =< 0 -> %%io:format("prom >0 : ~p~p~p~n",[{Fx,Fy},{Bx,By},Tail]),
  41.           marvis(List, [{Fx,Fy},{Bx,By}|Tail]);
  42.        Rot > 0 -> %%io:format("prom =<0 : ~p~p~p~p~n",[{Fx,Fy},{Ax,Ay},{Bx,By},Tail]),
  43.         marvis(List, [{Fx,Fy},{Ax,Ay},{Bx,By}|Tail])
  44.     end.
  45.  
  46. perimetr([{_,_}],Perim) ->
  47.     io:format("~p~n",[Perim]);
  48. perimetr([{Ax,Ay},{Bx,By}|Tail],Perim) ->
  49.     N = perim({Ax,Ay},{Bx,By}),
  50.     perimetr([{Bx,By}|Tail],Perim+N).
  51.  
  52. perim({Ax,Ay},{Bx,By}) ->
  53.     math:sqrt(math:pow(Bx-Ax,2)+math:pow(By-Ay,2)).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement