"angle %= 2 * math.pi;" 在波纹管代码中的目的是什么?
What is the purpose of "angle %= 2 * math.pi;" in the bellow code?
我是运行这个来自Flame引擎源码的例子,想知道update方法中angle %= 2 * math.pi;
的作用是什么。注释掉也不会影响矩形的圆形动画!如果有数学上的原因,请尽可能在相关文章中添加 link。
import 'dart:math' as math;
import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flame/input.dart';
import 'package:flame/palette.dart';
import 'package:flutter/material.dart';
void main() {
runApp(
GameWidget(
game: MyGame(),
),
);
}
/// This example simply adds a rotating white square on the screen, if you press
/// somewhere other than on the existing square another square will be added and
/// if you press on a square it will be removed.
class MyGame extends FlameGame with DoubleTapDetector, HasTappables {
bool running = true;
@override
Future<void> onLoad() async {
add(Square(Vector2(100, 200)));
}
@override
void onTapUp(int id, TapUpInfo info) {
super.onTapUp(id, info);
if (!info.handled) {
final touchPoint = info.eventPosition.game;
add(Square(touchPoint));
}
}
@override
void onDoubleTap() {
if (running) {
pauseEngine();
} else {
resumeEngine();
}
running = !running;
}
}
class Square extends PositionComponent with Tappable {
static const speed = 0.25;
static const squareSize = 128.0;
static Paint white = BasicPalette.white.paint();
static Paint red = BasicPalette.red.paint();
static Paint blue = BasicPalette.blue.paint();
Square(Vector2 position) : super(position: position);
@override
Future<void> onLoad() async {
super.onLoad();
size.setValues(squareSize, squareSize);
anchor = Anchor.center;
}
@override
void render(Canvas canvas) {
canvas.drawRect(size.toRect(), white);
canvas.drawRect(const Rect.fromLTWH(0, 0, 30, 30), red);
canvas.drawRect(Rect.fromLTWH(width / 2, height / 2, 3, 3), blue);
}
@override
void update(double dt) {
super.update(dt);
angle += speed * dt;
angle %= 2 * math.pi; //<---- What is the reason behind this line?
}
@override
bool onTapUp(TapUpInfo info) {
removeFromParent();
return true;
}
}
它确保angle
永远不会超过2×PI,一个角度的最大值,以弧度为单位。通过按此值执行模数,任何超过 2×PI 的数字将从 0 回绕。
在某些时候,如果你没有高转速,很长一段时间后,角度会溢出 double
可以容纳的角度。
这里的角度单位是弧度,一个完整的圆是2π(360°)。
因为当我们旋转了一个完整的圆圈时,我们也可以再次回到 0,我们使用模数来删除当前 angle
.
中的所有“未使用”的完整圆圈
What will happen if exceeds 2*pi.
什么也不会发生,它会继续旋转,但角度会继续增长到不必要的大值。
我是运行这个来自Flame引擎源码的例子,想知道update方法中angle %= 2 * math.pi;
的作用是什么。注释掉也不会影响矩形的圆形动画!如果有数学上的原因,请尽可能在相关文章中添加 link。
import 'dart:math' as math;
import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flame/input.dart';
import 'package:flame/palette.dart';
import 'package:flutter/material.dart';
void main() {
runApp(
GameWidget(
game: MyGame(),
),
);
}
/// This example simply adds a rotating white square on the screen, if you press
/// somewhere other than on the existing square another square will be added and
/// if you press on a square it will be removed.
class MyGame extends FlameGame with DoubleTapDetector, HasTappables {
bool running = true;
@override
Future<void> onLoad() async {
add(Square(Vector2(100, 200)));
}
@override
void onTapUp(int id, TapUpInfo info) {
super.onTapUp(id, info);
if (!info.handled) {
final touchPoint = info.eventPosition.game;
add(Square(touchPoint));
}
}
@override
void onDoubleTap() {
if (running) {
pauseEngine();
} else {
resumeEngine();
}
running = !running;
}
}
class Square extends PositionComponent with Tappable {
static const speed = 0.25;
static const squareSize = 128.0;
static Paint white = BasicPalette.white.paint();
static Paint red = BasicPalette.red.paint();
static Paint blue = BasicPalette.blue.paint();
Square(Vector2 position) : super(position: position);
@override
Future<void> onLoad() async {
super.onLoad();
size.setValues(squareSize, squareSize);
anchor = Anchor.center;
}
@override
void render(Canvas canvas) {
canvas.drawRect(size.toRect(), white);
canvas.drawRect(const Rect.fromLTWH(0, 0, 30, 30), red);
canvas.drawRect(Rect.fromLTWH(width / 2, height / 2, 3, 3), blue);
}
@override
void update(double dt) {
super.update(dt);
angle += speed * dt;
angle %= 2 * math.pi; //<---- What is the reason behind this line?
}
@override
bool onTapUp(TapUpInfo info) {
removeFromParent();
return true;
}
}
它确保angle
永远不会超过2×PI,一个角度的最大值,以弧度为单位。通过按此值执行模数,任何超过 2×PI 的数字将从 0 回绕。
在某些时候,如果你没有高转速,很长一段时间后,角度会溢出 double
可以容纳的角度。
这里的角度单位是弧度,一个完整的圆是2π(360°)。
因为当我们旋转了一个完整的圆圈时,我们也可以再次回到 0,我们使用模数来删除当前 angle
.
What will happen if exceeds 2*pi.
什么也不会发生,它会继续旋转,但角度会继续增长到不必要的大值。