【问题标题】:Android Path collision problems/solutionsAndroid路径碰撞问题/解决方案
【发布时间】:2011-07-12 20:16:14
【问题描述】:

我在 Android 中有一个绘图应用程序,它允许用户用手指绘图,然后将生成的形状存储为 Android Paths。为了允许用户删除他们绘制的单个Paths,我实现了this solution,它为每个Path 使用边界Rect,然后使用内部多维二进制数组来表示内部的像素边界Rect。然后我通过获取路径的控制点来填充数组,并使用二次贝塞尔曲线的数学方程沿着它进行跟踪,将数组中的每个元素都设置为 1。

使用上述设置,当处于擦除模式时,我首先检查用户手指与边界Rect 之间的碰撞,如果发生碰撞,然后检查用户触摸的像素是否设置为数组中的 1。

现在,当用户加载笔记时,我会将所有形状加载到“笔划”对象的ArrayList 中,这样我就可以轻松地显示它们,并在擦除模式下循环检查它们是否存在碰撞。我还将Rect 和带有笔划的二进制数组存储在自定义对象中。一切都按预期工作,但是存储所有这些数据的内存占用,特别是每个路径边界的二进制数组Rect,变得越来越昂贵,当用户有大量笔划时,我得到一个java.lang.OutOfMemoryError在我的代码部分为每个笔画创建数组。

对实现此目的的更好方法有什么建议吗?本质上,我试图确定两个 Android 路径(绘图路径,然后是用户在擦除模式下创建的路径)之间的冲突,虽然上述方法在理论上可行,但实际上它是不可行的。

谢谢,

保罗

【问题讨论】:

    标签: android path collision-detection


    【解决方案1】:

    “二进制数组”的实际表示是什么?我认为,如果您调整表示以反映您需要存储的实际数据(例如 RLE 编码位:在这个 y 开始于这个 x 和 z 像素),您将能够存储您需要的内容而不会过大。

    存储一个实际的字节数组,每像素一个字节,或者每 8 个像素(如果你正在做的话)对于这个用途来说是不必要的。

    另一种选择是根本不存储位图,只存储控制点和边界框。如果触摸与边界框相交,您将根据控制点即时计算位图。

    【讨论】:

    • 表示是位图的表示,所以数组是int类型的,维度是rect_width,rect_height。嗯,考虑过即时计算位图,但认为从性能的角度来看它可能太昂贵了(尽管我可能没有选择,显然)。 RLE 也可能工作,所以基本上,我会存储路径的 RLE 指令,当尝试检测点 X、Y 是否命中路径时,我会沿着 RLE 追踪?
    • @Paul -- RLE 有多种选择;一个是边界框中的每个 y 将路径和 y 的交集存储为 (x, run_length) 对象(这是一条贝塞尔曲线,所以每个 y 最多有两个,我猜......)跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多