大家好 我有这个图像,我想绘制两点之间的“路径”。
我的尝试:
使用保存在数据库中的主要点绘制路径。 “x,y表示点”并在多点之间画线直到到达终点。比如图像2
我正在考虑的是,如果我将图像划分为方格,例如15 * 15,并给每个方格x,y,标记,其中标记可以是0,1这意味着墙或任何东西0不能步行扔它1你可以。 并动态创建浴缸。
这就是我现在拥有的所有想法:)如果还有其他方式我不知道它。 PLZ帮帮我:)。
更新:
- 用户可以放大/缩小。 - 我想做的就像this
答案 0 :(得分:3)
您可以直接修改位图,也可以在位图顶部放置SurfaceView
并在SurfaceView
上绘图。在这种情况下,您只需要在onDraw
的{{1}}方法中绘制线条。
我在Turtle Draw应用中绘制了很多行...这是我如何延伸SurfaceView
SurfaceView
答案 1 :(得分:2)
您可以使用Path课程。祝你好运!
答案 2 :(得分:1)
如果我理解得很好,你的主要问题不是在图像上画线。您正在寻找可以在给定地图中捕获的WHICH PATH。这是对的吗?
嗯,如果是这种情况,那么您正在寻找A* search algorithm。它是一种众所周知的路径查找方法,在需要这种AI的游戏和其他应用程序中非常常见。
您可以根据自己的需要开发自己的算法实现,也可以尝试使用第三方的API。
您可以在Google代码中使用one。这是简单的java和apache许可证,因此可以在你的Android应用程序中使用。
但是等等,我也简要介绍了github,似乎有一个lot more不同的实现可供使用!
Search web你也会发现很多文章,教程,论文......
祝你好运!修改强>
正如您在下面的评论中所解释的那样,您的主要问题是通过动态处理“地图”来找到“墙”,以便您可以应用A *搜索,然后最后在所有这些上绘制线条。
嗯,要以图像方式处理图像,你需要一些第三方库这样做,有很多,但可能更好的解决方案是使用OpenCV。它与android兼容,有很好的文档和很多关于它的文章。这是一个tutorial,其中有一个用于在图像中查找“线条”的示例。这也可以应用于您的地图。您可能需要调整阈值,直到您只检测到较粗的墙壁为止。
答案 3 :(得分:1)
答案 4 :(得分:0)
尝试在图像中搜索白色像素(这可能是你可以走路的路径)
答案 5 :(得分:0)
我的回答是假设您正在尝试计算某人从黑色圆圈到红色圆圈的最简单路径。如果您只是寻求实际绘制线条的帮助,请忽略此答案。我还假设您可以提前定义所有交叉点。如果您需要从图片中以编程方式派生它们,您应该从一个新问题开始。
我会从您建议的(x,y)点开始,但不要使用标记值。然后我会在这些点之间添加连接作为相关对象,添加比标记值更多的细节。每个Point都有一组与其他相邻点的连接。在每个连接上,我会在计算中使用一堆属性,例如距离,障碍和任何其他增强功能,例如权限。距离很容易(提示:使用毕达哥拉斯定理)。障碍可能包括门,台阶,电梯等。权限可能包括受限制的访问区域(图表顶部附近的对角线走廊看起来受限制)。
看起来在黑色的起点,你可以向东或向西。那将是两条不同的道路。向东的第一个点将提供四种选择:通过北门,南门,继续向东或向西返回。 west选项将返回到原始点,在该点处可以忽略路径作为循环。南方的选项只会回到这一点,在那里可以忽略它作为一个循环。北方的选择很有意思,因为它应该继续穿过对角走廊,并最终提供通往目的地的路径,尽管显然不是最好的路径。东部的选项将继续,并最终返回几个选项。当一条路径到达目的地时,它会注意到一个肯定的响应以及根据所经过的连接(距离,障碍和特权)到达那里的难度。
实现此操作将涉及引入一个路径,该路径包括遍历的点列表以及沿这些点的每个连接的累积难度。从原点开始,我会尝试编写一些在所有方向上分支一步的东西,而不是试图完全遍历每条路径。加上每一步的累积难度。如果该点是目的地,那么您有一条成功的路径(尽管它可能不是最有效的路径)。如果该点已经在路径中,则它是一个循环,因此停止遍历该路径。如果路径的累积难度大于已找到的另一个难度,则停止遍历该路径。
答案 6 :(得分:0)
如果不使用OpenGL(并让它将你的线的X / Y位置转换为屏幕上的实际X / Y位置),我认为这是不可能的。
在OpenGL中,您可以在2D平面中渲染平面布置图。您需要预先计算绘制线条的每个交叉点的世界空间位置(x,y,z),并创建一个集合,其中每个位置都有一个可以连接到的其他位置的数组。然后你需要执行(递归)逻辑来确定起点和终点之间的点,并在每个点之间绘制2D线。
所以,它很可能,但是平移和缩放的需要几乎不需要相机,这是OpenGL的用武之地。
平移和缩放将通过移动相机来处理,同时将其保持在预定义范围内,以便(基于所选择的FOV)它不会显示(太多)超出图像边缘。