从给定角度计算目标像素

我想要什么:

从给定角度计算目标像素

我正在使用方向传感器来获取方位角值(角度)。我也从用户出发,画了一个圆。现在,我要考虑到一步等于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;
            }
shuaikai006 回答:从给定角度计算目标像素

鉴于计算出的角度为:

enter image description here

这是方程式。

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)

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

enter image description here

那么您将需要;

  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,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);
    }

角度调整将为90

本文链接:https://www.f2er.com/3014137.html

大家都在问