从给定角度计算目标像素
Calculate target Pixels from given Angle
我想要什么:
我正在使用方向传感器获取方位角值(角度)。我也从用户那里开始并画了一个圆圈。现在我想在用户前进的点上绘制下一个像素,考虑到一步等于 30 像素。
当用户开始行走时,我想在屏幕上插入的平面图图像上绘制用户当前位置的圆圈。由于某些原因,我无法将 GPS 用于此解决方案。
以下是我正在执行的步骤:
- 从方向传感器获取当前用户方向的角度。
- 用户将触摸屏幕以在图像上绘制起点。
- 当用户开始行走时,它会在图像上绘制相对于用户真实世界方向的点,如我在上图中所示。我如何才能在给定起点(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;
}
鉴于计算出的角度是:
这是方程式。
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)
例如计算出的角度是这样的:
那么你需要;
- 向右旋转 90 度或向左旋转 270 度。
- 翻译。
- 向右旋转 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
我想要什么:
当用户开始行走时,我想在屏幕上插入的平面图图像上绘制用户当前位置的圆圈。由于某些原因,我无法将 GPS 用于此解决方案。
以下是我正在执行的步骤:
- 从方向传感器获取当前用户方向的角度。
- 用户将触摸屏幕以在图像上绘制起点。
- 当用户开始行走时,它会在图像上绘制相对于用户真实世界方向的点,如我在上图中所示。我如何才能在给定起点(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;
}
鉴于计算出的角度是:
这是方程式。
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)
例如计算出的角度是这样的:
那么你需要;
- 向右旋转 90 度或向左旋转 270 度。
- 翻译。
- 向右旋转 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