import 'dart:math'; import 'dart:ui'; double percentageToRadians(double percentage) => ((2 * pi * percentage) / 100); double radiansToPercentage(double radians) { var normalized = radians < 0 ? -radians : 2 * pi - radians; var percentage = ((100 * normalized) / (2 * pi)); // TODO we have an inconsistency of pi/2 in terms of percentage and radians return (percentage + 25) % 100; } double coordinatesToRadians(Offset center, Offset coords) { var a = coords.dx - center.dx; var b = center.dy - coords.dy; return atan2(b, a); } Offset radiansToCoordinates(Offset center, double radians, double radius) { var dx = center.dx + radius * cos(radians); var dy = center.dy + radius * sin(radians); return Offset(dx, dy); } double valueToPercentage(int time, int intervals) => (time / intervals) * 100; int percentageToValue(double percentage, int intervals) => ((percentage * intervals) / 100).round(); bool isPointInsideCircle(Offset point, Offset center, double rradius) { var radius = rradius * 1.2; return point.dx < (center.dx + radius) && point.dx > (center.dx - radius) && point.dy < (center.dy + radius) && point.dy > (center.dy - radius); } bool isPointAlongCircle(Offset point, Offset center, double radius) { // distance is root(sqr(x2 - x1) + sqr(y2 - y1)) // i.e., (7,8) and (3,2) -> 7.21 var d1 = pow(point.dx - center.dx, 2); var d2 = pow(point.dy - center.dy, 2); var distance = sqrt(d1 + d2); return (distance - radius).abs() < 10; } double getSweepAngle(double init, double end) { if (end > init) { return end - init; } return (100 - init + end).abs(); } List getSectionsCoordinatesInCircle( Offset center, double radius, int sections) { var intervalAngle = (pi * 2) / sections; return List.generate(sections, (int index) => index).map((i) { var radians = (pi / 2) + (intervalAngle * i); return radiansToCoordinates(center, radians, radius); }).toList(); } bool isAngleInsideRadiansSelection(double angle, double start, double sweep) { var normalized = angle > pi / 2 ? 5 * pi / 2 - angle : pi / 2 - angle; var end = (start + sweep) % (2 * pi); return end > start ? normalized > start && normalized < end : normalized > start || normalized < end; } // this is not 100% accurate but it works // we just want to see if a value changed drastically its value bool radiansWasModuloed(double current, double previous) { return (previous - current).abs() > (3 * pi / 2); }