在我完成研究之前,请关注我的问题并提出这个问题,
基本上我想找到一个圆圈,圆圈......矩形,矩形或圆形,矩形重叠
在数学上我将我的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.
提前致谢
答案 0 :(得分:0)
两件事:
由于您将圈子表示为{circle, {X,Y}, R}
格式的元组,因此overlapping
函数的两个参数都应为circle
。如果您为第二个参数添加circle2
,则它与您的圆圈元组不匹配,并且您将收到function_clause
错误。
由于您已经匹配变量X
,Y
,R
,X2
,Y2
和R2
在功能头中,不需要下面的两行。 (事实上,那些将永远失败,因为任何以小写字母开头的单词都是一个原子,并且你试图将一个原子与一个元组匹配:这会给你一个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
所做的只是检查true
或false
并返回相同的值,因此您可以通过删除代码来简化代码:
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.