mirror of https://github.com/flutter/pinball.git
parent
fee6a000a4
commit
4e2f56a70c
@ -0,0 +1,7 @@
|
|||||||
|
# See https://www.dartlang.org/guides/libraries/private-files
|
||||||
|
|
||||||
|
# Files and directories created by pub
|
||||||
|
.dart_tool/
|
||||||
|
.packages
|
||||||
|
build/
|
||||||
|
pubspec.lock
|
@ -0,0 +1,11 @@
|
|||||||
|
# maths
|
||||||
|
|
||||||
|
[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
|
||||||
|
[![License: MIT][license_badge]][license_link]
|
||||||
|
|
||||||
|
A Very Good Project created by Very Good CLI.
|
||||||
|
|
||||||
|
[license_badge]: https://img.shields.io/badge/license-MIT-blue.svg
|
||||||
|
[license_link]: https://opensource.org/licenses/MIT
|
||||||
|
[very_good_analysis_badge]: https://img.shields.io/badge/style-very_good_analysis-B22C89.svg
|
||||||
|
[very_good_analysis_link]: https://pub.dev/packages/very_good_analysis
|
@ -0,0 +1 @@
|
|||||||
|
include: package:very_good_analysis/analysis_options.2.4.0.yaml
|
@ -0,0 +1,3 @@
|
|||||||
|
library maths;
|
||||||
|
|
||||||
|
export 'src/maths.dart';
|
@ -0,0 +1,81 @@
|
|||||||
|
import 'dart:math' as math;
|
||||||
|
import 'package:flame/extensions.dart';
|
||||||
|
|
||||||
|
/// Method to calculate all points (with a required precision amount of them)
|
||||||
|
/// of a circumference based on angle, offsetAngle and radius
|
||||||
|
List<Vector2> calculateArc({
|
||||||
|
required Vector2 center,
|
||||||
|
required double radius,
|
||||||
|
required double angle,
|
||||||
|
double offsetAngle = 0,
|
||||||
|
int precision = 100,
|
||||||
|
}) {
|
||||||
|
final stepAngle = radians(angle / precision);
|
||||||
|
final stepOffset = radians(offsetAngle);
|
||||||
|
|
||||||
|
final points = <Vector2>[];
|
||||||
|
for (var i = 0; i <= precision; i++) {
|
||||||
|
final xCoord = center.x + radius * math.cos((stepAngle * i) + stepOffset);
|
||||||
|
final yCoord = center.y - radius * math.sin((stepAngle * i) + stepOffset);
|
||||||
|
|
||||||
|
final point = Vector2(xCoord, yCoord);
|
||||||
|
points.add(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Method that calculates all points of a bezier curve of degree 'g' and
|
||||||
|
/// n=g-1 control points and range 0<=t<=1
|
||||||
|
/// https://en.wikipedia.org/wiki/B%C3%A9zier_curve
|
||||||
|
List<Vector2> calculateBezierCurve({
|
||||||
|
required List<Vector2> controlPoints,
|
||||||
|
double step = 0.001,
|
||||||
|
}) {
|
||||||
|
assert(
|
||||||
|
controlPoints.length >= 2,
|
||||||
|
'At least 2 control points to create a bezier curve',
|
||||||
|
);
|
||||||
|
var t = 0.0;
|
||||||
|
final n = controlPoints.length - 1;
|
||||||
|
final points = <Vector2>[];
|
||||||
|
|
||||||
|
do {
|
||||||
|
var xCoord = 0.0;
|
||||||
|
var yCoord = 0.0;
|
||||||
|
for (var i = 0; i <= n; i++) {
|
||||||
|
final point = controlPoints[i];
|
||||||
|
|
||||||
|
xCoord +=
|
||||||
|
_binomial(n, i) * math.pow(1 - t, n - i) * math.pow(t, i) * point.x;
|
||||||
|
yCoord +=
|
||||||
|
_binomial(n, i) * math.pow(1 - t, n - i) * math.pow(t, i) * point.y;
|
||||||
|
}
|
||||||
|
points.add(Vector2(xCoord, yCoord));
|
||||||
|
|
||||||
|
t = t + step;
|
||||||
|
} while (t <= 1);
|
||||||
|
|
||||||
|
return points;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Method to calculate the binomial coefficient of 'n' and 'k'
|
||||||
|
/// https://en.wikipedia.org/wiki/Binomial_coefficient
|
||||||
|
num _binomial(num n, num k) {
|
||||||
|
assert(0 <= k && k <= n, 'Range 0<=k<=n');
|
||||||
|
if (k == 0 || n == k) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return _factorial(n) / (_factorial(k) * _factorial(n - k));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Method to calculate the factorial of some number 'n'
|
||||||
|
/// https://en.wikipedia.org/wiki/Factorial
|
||||||
|
num _factorial(num n) {
|
||||||
|
if (n == 1) {
|
||||||
|
return 1;
|
||||||
|
} else {
|
||||||
|
return n * _factorial(n - 1);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
name: maths
|
||||||
|
description: A Very Good Project created by Very Good CLI.
|
||||||
|
version: 1.0.0+1
|
||||||
|
publish_to: none
|
||||||
|
|
||||||
|
environment:
|
||||||
|
sdk: ">=2.16.0 <3.0.0"
|
||||||
|
|
||||||
|
dev_dependencies:
|
||||||
|
coverage: ^1.1.0
|
||||||
|
mocktail: ^0.2.0
|
||||||
|
test: ^1.19.2
|
||||||
|
very_good_analysis: ^2.4.0
|
||||||
|
dependencies:
|
||||||
|
flame: ^1.0.0
|
@ -0,0 +1,11 @@
|
|||||||
|
// ignore_for_file: prefer_const_constructors
|
||||||
|
import 'package:maths/maths.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
group('Maths', () {
|
||||||
|
test('can be instantiated', () {
|
||||||
|
expect(Maths(), isNotNull);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in new issue