在erlang中重叠2D形状

时间:2016-02-15 18:43:26

标签: erlang

在我完成研究之前,请关注我的问题并提出这个问题,

基本上我想找到一个圆圈,圆圈......矩形,矩形或圆形,矩形重叠

在数学上我将我的3个案例作为伪编码算法,我需要帮助的是在erlang中实现这个,但我只会要求圆圈,因为我可以通过语法理解其余部分。

perim({circle, {X,Y}, R}) -> 
math:pi()*(R * 2);
perim({rectangle, {X,Y}, H, W})-> 
  (H + W) * 2.

overlap({_,{_,_},_,_},{_,{_,_},_,_}) ->
overlapping({_,{_,_},_,_},{_,{_,_},_,_}).


%overlap cases

%Circle,Circle
overlapping({circle, {X,Y}, R},{circle2, {X2,Y2}, R2}) ->
   circle1 = {{X,Y},R},
   circle2 = {{X2,Y2},R2},
   case (math:sqrt(abs(X)-abs(X2)) + math:sqrt(abs(Y)-abs(Y2))) < math:sqrt(abs(R)+abs(R2)) of
           true -> true;
           false -> false
    end.    

提前致谢

2 个答案:

答案 0 :(得分:0)

两件事:

  • 由于您将圈子表示为{circle, {X,Y}, R}格式的元组,因此overlapping函数的两个参数都应为circle。如果您为第二个参数添加circle2,则它与您的圆圈元组不匹配,并且您将收到function_clause错误。

  • 由于您已经匹配变量XYRX2Y2R2在功能头中,不需要下面的两行。 (事实上​​,那些将永远失败,因为任何以小写字母开头的单词都是一个原子,并且你试图将一个原子与一个元组匹配:这会给你一个badmatch错误。)< / p>

那就是:

overlapping({circle, {X,Y}, R},{circle, {X2,Y2}, R2}) ->
   case (math:sqrt(abs(X)-abs(X2)) + math:sqrt(abs(Y)-abs(Y2))) < math:sqrt(abs(R)+abs(R2)) of
           true -> true;
           false -> false
    end.    

此外,由于case所做的只是检查truefalse并返回相同的值,因此您可以通过删除代码来简化代码:

overlapping({circle, {X,Y}, R},{circle, {X2,Y2}, R2}) ->
   (math:sqrt(abs(X)-abs(X2)) + math:sqrt(abs(Y)-abs(Y2))) < math:sqrt(abs(R)+abs(R2)).    

要详细了解模式匹配,您可能会发现“了解一些Erlang”中的this chapter非常有用。

答案 1 :(得分:0)

无法在评论中正确格式化您的代码段。试试这个(在每个案例陈述之后使用&#39 ;;&#39;):

overlap({{circle,{X,Y},R},{rectangle,{X2,Y2},H,W}}) ->
   X_Axis = X - X2,
   Y_Axis = Y - Y2,
      case abs(X_Axis) >= (0.5*abs(W) + R) orelse abs(Y_Axis) >= (0.5*abs(H) + R) of
        true -> ((X == X2) andalso (Y-Y2));
        true -> ((abs(X_Axis) < 0.5*W) andalso (abs(Y_Axis) < (0.5*H + R)));
        true -> ((abs(X_Axis) < 0.5*W + R) andalso (abs(Y_Axis) < 0.5*H));
        false -> false  
      end.