Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中获取圆弧或椭圆上的点_Android_Graphics_2d - Fatal编程技术网

在Android中获取圆弧或椭圆上的点

在Android中获取圆弧或椭圆上的点,android,graphics,2d,Android,Graphics,2d,我试图创造一些类似“大轮子”的东西,但价格是正确的。有点像这样: 我已经完成了左边的椭圆形,右边的弧形和顶部和底部的柱子。我迷茫的是如何在不诉诸于一堆复杂数学的情况下创建内部线条。我想,如果我能以某种方式获得形状上的点,我就可以很容易地以这种方式绘制线条。然而,我没有在Android SDK中找到任何可以提供此功能的东西 有没有办法在Android中获取绘制对象的点?如果没有,有没有一个我没有看到的更简单的解决方案 提前谢谢 编辑#1: 在下面的帖子中,我对数学进行了一次重击,但似乎无法让它发

我试图创造一些类似“大轮子”的东西,但价格是正确的。有点像这样:

我已经完成了左边的椭圆形,右边的弧形和顶部和底部的柱子。我迷茫的是如何在不诉诸于一堆复杂数学的情况下创建内部线条。我想,如果我能以某种方式获得形状上的点,我就可以很容易地以这种方式绘制线条。然而,我没有在Android SDK中找到任何可以提供此功能的东西

有没有办法在Android中获取绘制对象的点?如果没有,有没有一个我没有看到的更简单的解决方案

提前谢谢

编辑#1:

在下面的帖子中,我对数学进行了一次重击,但似乎无法让它发挥作用:(

这就是我到目前为止所做的:

            float a = (leftOval.bottom - leftOval.top) / 2;
            float b = (leftOval.right - leftOval.left) / 2;
            float x1 = (float) getXForOval(a, b, top + 50);
            float y1 = top + 50;
            float x2 = x1 + 50;
            float y2 = y1;

            Log.d("coords", "compute: " + getXForOval(a, b, top + 50) + "");

            Log.d("coords", "leftOval.top: " + leftOval.top + "");
            Log.d("coords", "leftOval.bottom: " + leftOval.bottom + "");

            Log.d("coords", "leftOval.right: " + leftOval.right + "");
            Log.d("coords", "leftOval.left: " + leftOval.left + "");

            Log.d("coords", "a: " + a + "");
            Log.d("coords", "b: " + b + "");
            Log.d("coords", "x1: " + x1 + "");
            Log.d("coords", "y1: " + y1 + "");
            Log.d("coords", "x2: " + x2 + "");
            Log.d("coords", "y2: " + y2 + "");

            canvas.drawLine(x1, y1, x2, y2, paint);

    private double getXForOval(float a, float b, float y) {
        // sqrt ( a^2 * (1 - y^2 / b^2) )

        // @formatter:off
        return Math.sqrt(
                        Math.abs(
                            Math.pow(a, 2) *    (   1 - 
                                                    ( Math.pow(y, 2) / Math.pow(b, 2) )
                                                )
                                )
                        );

        // @formatter:on
    }
但是X值太大了,我做错了什么

08-27 18:16:56.574: DEBUG/coords(2785): compute: 2743.647207641682
08-27 18:16:56.584: DEBUG/coords(2785): leftOval.top: 180.0
08-27 18:16:56.584: DEBUG/coords(2785): leftOval.bottom: 780.0
08-27 18:16:56.584: DEBUG/coords(2785): leftOval.right: 185.0
08-27 18:16:56.584: DEBUG/coords(2785): leftOval.left: 135.0
08-27 18:16:56.584: DEBUG/coords(2785): a: 300.0
08-27 18:16:56.584: DEBUG/coords(2785): b: 25.0
08-27 18:16:56.584: DEBUG/coords(2785): x1: 2743.6472
08-27 18:16:56.584: DEBUG/coords(2785): y1: 230.0
08-27 18:16:56.584: DEBUG/coords(2785): x2: 2793.6472
08-27 18:16:56.584: DEBUG/coords(2785): y2: 230.0

我不知道有任何调用可以让您获得绘制对象的点


我会写一个函数来循环需要画多少条线,只需要一点数学就可以找到这条线的x起点和x终点坐标。

数学并不复杂。椭圆的公式是x^2/a^2+y^2/b^2=1,其中a和b是长轴和短轴的长度,它们是常数。你不需要o为给定的y求x,该y是sqrt(a^2*(1-y^2/b^2))。这将获得从左椭圆中心的x,y偏移量,直线长度是恒定的。使用正弦函数设置y值的动画,看起来应该不错

编辑:

很抱歉,我对a和b的评论应该提到它们是颠倒的。另外,你必须使用相对于椭圆中心的y坐标

将数字自身相乘比使用Math.pow进行平方运算要快

        // a should be half the width
        float a = (leftOval.right - leftOval.left) / 2;
        // and b half the height
        float b = (leftOval.bottom - leftOval.top) / 2;

        float yCenter = (leftOval.top + leftOval.bottom) / 2;
        float xCenter = (leftOval.right + leftOval.left) / 2;

        float x1 = (float) getXForOval(a, b, top + 150, xCenter, yCenter);
        float y1 = top + 150;
        float x2 = x1 + 50;
        float y2 = y1;

        Log.d("coords",
                "compute: " + getXForOval(a, b, top + 50, xCenter, yCenter)
                        + "");

        Log.d("coords", "leftOval.top: " + leftOval.top + "");
        Log.d("coords", "leftOval.bottom: " + leftOval.bottom + "");

        Log.d("coords", "leftOval.right: " + leftOval.right + "");
        Log.d("coords", "leftOval.left: " + leftOval.left + "");

        Log.d("coords", "a: " + a + "");
        Log.d("coords", "b: " + b + "");
        Log.d("coords", "x1: " + x1 + "");
        Log.d("coords", "y1: " + y1 + "");
        Log.d("coords", "x2: " + x2 + "");
        Log.d("coords", "y2: " + y2 + "");

        canvas.drawLine(x1, y1, x2, y2, paint);
    }
}

private double getXForOval(float a, float b, float y, float xCenter,
        float yCenter) {
    // sqrt ( a^2 * (1 - y^2 / b^2) )

    // calculation based on values relative to the center
    float yOffset = y - yCenter;

    // @formatter:off 
    return Math.sqrt( 
                    Math.abs( 
                        a * a *    (   1 -  
                                                ( (yOffset * yOffset) / (b * b) ) 
                                            ) 
                            ) 
                    ) + xCenter; 
   // @formatter:on
}

Android用矩形绘制椭圆,这是否意味着a是矩形的高度,b是宽度+1@javamonkey一半高一半宽。@javamonkey很抱歉,a是一半宽,b是一半高-见编辑我非常感谢您的帮助,但是,我粘贴了您上面所写的内容,但仍然不起作用计算的x值不是很大,但仍然不正确。必须将最终值添加到xCenter,这就解决了问题。谢谢。