【问题标题】:Sampling a Drawn Line into an Array将绘制的线采样到数组中
【发布时间】:2012-11-16 05:48:59
【问题描述】:

我想将用户在 Android 屏幕上手绘的线条“采样”到一个数组中。 x 坐标是等距的,很可能是一维数组的索引。

举个例子,如果用户绘制一个近似正弦波,我想创建一个数组,可以将该近似正弦波转换为另一个图形,或用于音频合成。

我对一种方法有一个基本的想法,从数组开始:

float samples[] = new float[100] // or some other arbitrary number

然后是ontouch方法:

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        float x = event.getX();
        float y = event.getY();
        if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE){
            // assume we translate x into relative index from 0-99 at this point
            if(!xHasPoint(x, samples)){
                drawNewPoint();
                samples[x] = y;
            }
            invalidate();
            return true;
        }
        else{
            invalidate();
            return false;
        }
    }

private static boolean xHasPoint(float x, float[] a){
    if(a[x] == !null){
         return true;
    }
    else{
         return false;
    }
}

所以我的问题是,你能提出一个更好的方法来解决这个问题吗?我预见到必须推断出大量数据...在最后循环遍历数组并从最近的非空值中分配空索引平均值,诸如此类。

另一方面,如果这看起来没有错,我是否遗漏了任何重要的大局考虑?

【问题讨论】:

    标签: android arrays drawing sampling


    【解决方案1】:

    唯一的问题是,一旦您的数组已满,您将无法继续添加更多点。我建议您使用可增长的数据结构。

    比如说,如果它是一个 ArrayList,你可以继续添加任意数量的点(理论上)。

    我不太明白hasPoints 方法。理想情况下,在绘制自身时,您应该同时对曲线进行采样和插值,并且还可以平滑曲线。

    更新: 是的,如果是这样的话,那么你只能在它移动时尝试注册一个点,比如超过 4 个像素,然后以某种方式插入并绘制曲线在前一点和下一点之间平滑它。而且,我猜你还需要捕获 y 点。

    【讨论】:

    • 好点。这个数组的接收器(libpd,Android 的纯数据)需要一个固定大小的数组,所以我想捕获一个集合数组。可能我可以捕获任意样本然后对其进行采样?就 xHasPoint 而言,我的想法是我只希望用户在每个 x 坐标上绘制一个点。
    • 我还有很多问题要解决。例如,如果我可以获得足够大的初始样本,也许我可以使用线性插值。这甚至可能是方形和三角形音频波的一个优点。继续并将其标记为答案。
    【解决方案2】:

    你的逻辑可能有问题。因为一次只触发一个触摸事件,即 ACTION_DOWN 或 ACTION_MOVE。所以你在 if() 块中写的逻辑不会被执行。

    【讨论】:

    • 是的。我打字太快了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多