【问题标题】:How do I find all the Points in a Path in Android?如何在 Android 中找到路径中的所有点?
【发布时间】:2011-12-19 20:13:06
【问题描述】:

不久前我问了一个问题,看看我是否能够在路径中找到一对特定点;但是,这次我想知道是否有办法知道路径中的所有点? (我找不到这样做的方法,这很不幸,因为 Java 提供了一种方法来做到这一点,而不是 Android?)

我问这个的原因是因为我有多个几何图形,我想比较这些点以查看它们相交的位置。

感谢任何有用的回复

【问题讨论】:

    标签: java android path point


    【解决方案1】:

    您可以使用PathMeasure 获取路径上任意点的坐标。例如这个简单的 sn-p(我看到的here)返回路径一半处的点的坐标:

    PathMeasure pm = new PathMeasure(myPath, false);
    //coordinates will be here
    float aCoordinates[] = {0f, 0f};
    
    //get point from the middle
    pm.getPosTan(pm.getLength() * 0.5f, aCoordinates, null);
    

    或者这个sn-p返回一个FloaPoints的数组。那个数组涉及路径上20个点的坐标:

    private FloatPoint[] getPoints() {
            FloatPoint[] pointArray = new FloatPoint[20];
            PathMeasure pm = new PathMeasure(path0, false);
            float length = pm.getLength();
            float distance = 0f;
            float speed = length / 20;
            int counter = 0;
            float[] aCoordinates = new float[2];
    
            while ((distance < length) && (counter < 20)) {
                // get point from the path
                pm.getPosTan(distance, aCoordinates, null);
                pointArray[counter] = new FloatPoint(aCoordinates[0],
                        aCoordinates[1]);
                counter++;
                distance = distance + speed;
            }
    
            return pointArray;
        }
    

    在上面的sn-p中,FloatPoint是一个封装点坐标的类:

    class FloatPoint {
            float x, y;
    
            public FloatPoint(float x, float y) {
                this.x = x;
                this.y = y;
            }
    
            public float getX() {
                return x;
            }
    
            public float getY() {
                return y;
            }
        }
    

    参考文献
    stackoverflow
    Animating an image using Path and PathMeasure – Android

    【讨论】:

    【解决方案2】:

    如果您创建了Path,这意味着在您的代码的某个点,您知道确切的(地理)点。为什么不将这一点放在ArrayList 或类似的地方?

    例如在做之前:

    path.lineTo(point.x, point.y);
    

    你可以这样做:

    yourList.add(point);
    path.lineTo(point.x, point.y);
    

    稍后您可以从ArrayList 获得所有积分。 请注意,您可以利用Enhanced For Loop SyntaxArrayList 的优势,它们的执行速度提高了三倍。

    【讨论】:

    • 如果没有其他选择,我会这样做。我将把这个问题留几天,如果没有其他建议,我会接受这个作为答案。
    • @StartingGroovy 好的,如果您最终选择此解决方案,请查看我更新的帖子,以利用性能加速。
    • 有趣,我不知道增强的 for 循环速度快了 3 倍 :) 谢谢你的花絮!
    • 如果你携带一个包含所有点的数据结构,为什么需要一个 Path 对象?复制这些数据违反了 DRY 原则。
    • 您不必知道要点。例如,如果您使用 android.graphics.Paint.getTextPath 获取路径
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多