0

我想要的是 :

在此处输入图像描述 我正在使用方向传感器来获取方位角值(角度)。我也从用户那里获取起点并画一个圆圈。现在我想在用户前进的点上绘制下一个像素,考虑到一步等于 30 像素。

当用户开始行走时,我想在屏幕上插入的平面图图像上绘制用户当前位置的圆圈。由于某些原因,我无法将 GPS 用于此解决方案。

以下是我正在执行的步骤:

  1. 从方向传感器获取当前用户方向的角度。
  2. 用户将触摸屏幕以在图像上绘制起点。
  3. 当用户开始行走时,它将在图像上相对于用户的真实世界方向绘制点,如上图所示。仅给定起点(pixelX,pixelY)和用户的起始角度以及他刚刚面对的当前角度,我怎么能肯定地实现这一点。

到目前为止我们所取得的成就:我们可以在 4 个角度(即 0、90,180 和 270)上绘制直线,只需对当前像素添加和减去像素即可。

newAzimuth 是当前用户方向的角度

           if (newAzimuth >= 45 && newAzimuth <= 135) {
                startX = startX + oneStepPixelsWidth;
            mScreenRotationTextView.setText("You turned (Right)");
            } else if (newAzimuth > 135 && newAzimuth <= 225) {
            mScreenRotationTextVniew.setText("You turned (Back)");
                startY = startY + oneStepPixelsHeight;
            } else if (newAzimuth > 225 && newAzimuth <= 315) {
            mScreenRotationTextView.setText("You turned (Left)");
                startX = startX - oneStepPixelsWidth;
            } else if (newAzimuth > 315 || newAzimuth < 45) {
            mScreenRotationTextView.setText("You turned (Front)");
                startY = startY - oneStepPixelsHeight;
            }
4

1 回答 1

1

鉴于计算的角度为:

在此处输入图像描述

这是方程式。

X=distance*cos(angle)
Y=distance*sin(angle)

在您的情况下,距离将始终为 30 像素

所以 (30Cos(Angle),30Sin(Angle)) 会给你你的位置。

要调整计算出的角度以使其工作,您可以使用这些公式旋转它们;

adjustedX = x cos(angle) − y sin(angle)
adjustedY = y cos(angle) + x sin(angle)

例如,如果计算的角度是这样的:

在此处输入图像描述

然后你需要;

  1. 向右旋转 90 度或向左旋转 270 度。
  2. 翻译。
  3. 向右旋转 270 度或向左旋转 90 度。
 private Pair<Double, Double> getPositionOf(Pair<Double, Double> lastPosition, double angle, int distance, int angleAdjustment)
    {
        final Pair<Double, Double> rotatedLeftPosition = rotateLeft(lastPosition, 360 - angleAdjustment);
        final Pair<Double, Double> translatedLocation = applyTranslationTo(rotatedLeftPosition, angle, distance);
        return rotateLeft(translatedLocation, angleAdjustment);
    }

    private Pair<Double, Double> rotateLeft(Pair<Double, Double> position, double degreeAngle)
    {
        double x = position.first;
        double y = position.second;

        double adjustedX = (x * Math.cos(degreeAngle)) - (y * Math.sin(degreeAngle));
        double adjustedY = (y * Math.cos(degreeAngle)) + (x * Math.sin(degreeAngle));
        return new Pair<>(adjustedX, adjustedY);
    }

    @NotNull
    private Pair<Double, Double> applyTranslationTo(final Pair<Double, Double> position, final double angle, final int distance)
    {
        double x = distance * Math.cos(angle);
        double y = distance * Math.sin(angle);
        return new Pair<>(position.first + x, position.second + y);
    }

其中 angleAdjustment 为 90

于 2019-11-28T12:45:15.013 回答