erlang实现bresenham算法

本文介绍了一种基于Erlang实现的简单路径查找算法,该算法能够从起点到终点找到一条路径,并详细展示了如何根据两个点之间的相对位置来决定横向或纵向移动优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

-module(path).
-export([start/0]).
start()->
	path_find({0,0},{15,23},[]). %%从{0,0}点走到点{15,23}
 path_find(Begin,End,Path)->
  {X,Y}=Begin,
  {EndX,EndY}=End,
  DeltaX=erlang:abs(2*(EndX-X)),
  DeltaY=erlang:abs(2*(EndY-Y)),
  if
	DeltaX>DeltaY->   %%每走一步x肯定增大,但是y不一定增大
	put(fraction,DeltaY*2-DeltaX),
	NewPath=step_x(Begin,End,Path,DeltaX,DeltaY);
	DeltaX=<DeltaY->   %%每走一步y肯定增大,但是x不一定增大
	put(fraction,DeltaX*2-DeltaY),
	NewPath=step_y(Begin,End,Path,DeltaX,DeltaY)
   end,
   %io:format("npc ai path is:~p~n",[NewPath]),
   NewPath.

step_x(End,End,Path,_DeltaX,_DeltaY)->
	Path;
step_x(Begin,End,Path,DeltaX,DeltaY)->
	{X,Y}=Begin,
	{EndX,EndY}=End,
	Fraction=get(fraction),
	if Fraction>=0->
		NextY=Y+erlang:min(1,EndY-Y),
		put(fraction,get(fraction)-DeltaX);
	    true->
		NextY=Y
	end,
	NextX=X+erlang:min(1,EndX-X),
	io:format("Next step is ~p ~p~n",[NextX,NextY]),
	NewPath=lists:append(Path, [{NextX,NextY}]),
	put(fraction,get(fraction)+DeltaY),
	step_x({NextX,NextY},End,NewPath,DeltaX,DeltaY).

step_y(End,End,Path,_DeltaX,_DeltaY)->
	Path;
step_y(Begin,End,Path,DeltaX,DeltaY)->
	{X,Y}=Begin,
	{EndX,EndY}=End,
	Fraction=get(fraction),
	if Fraction>=0->
		NextX=X+erlang:min(1,EndX-X),
		put(fraction,get(fraction)-DeltaX);
	    true->
		NextX=X
	end,
	NextY=Y+erlang:min(1,EndY-Y),
	%io:format("Next step is ~p ~p~n",[NextX,NextY]),
	NewPath=lists:append(Path,[{NextX,NextY}]),
	put(fraction,get(fraction)+DeltaX),
	step_y({NextX,NextY},End,NewPath,DeltaX,DeltaY).


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值