utils.dart 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import 'dart:convert';
  2. import 'dart:math';
  3. import 'package:flutter/material.dart';
  4. import 'package:crypto/crypto.dart';
  5. class ColorUtil {
  6. static Color generateColor(String uuid) {
  7. final hash = sha256.convert(utf8.encode(uuid)).toString();
  8. final intHash = int.parse(hash.substring(hash.length - 10), radix: 16);
  9. final Random random = Random(intHash);
  10. final double r = random.nextInt(256).toDouble();
  11. final double g = random.nextInt(256).toDouble();
  12. final double b = random.nextInt(256).toDouble();
  13. List<double> hsl = rgbToHsl(r, g, b);
  14. List<int> rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
  15. return Color.fromRGBO(
  16. rgb[0],
  17. rgb[1],
  18. rgb[2],
  19. 1,
  20. );
  21. }
  22. static List<double> rgbToHsl(double r, double g, double b) {
  23. r /= 255;
  24. g /= 255;
  25. b /= 255;
  26. double max1 = max(max(r, g), b);
  27. double min1 = min(min(r, g), b);
  28. double h = 0;
  29. if (max1 == min1) {
  30. h = 0; // achromatic
  31. } else {
  32. double d = max1 - min1;
  33. if (max1 == r) {
  34. h = (g - b) / d + (g < b ? 6 : 0);
  35. } else if (max1 == g) {
  36. h = (b - r) / d + 2;
  37. } else if (max1 == b) {
  38. h = (r - g) / d + 4;
  39. }
  40. h /= 6;
  41. }
  42. return [h, 0.8, 0.5];
  43. }
  44. static List<int> hslToRgb(double h, double s, double l) {
  45. double r, g, b;
  46. if (s == 0) {
  47. r = g = b = l; // achromatic
  48. } else {
  49. double q = l < 0.5 ? l * (1 + s) : l + s - l * s;
  50. double p = 2 * l - q;
  51. r = hue2rgb(p, q, h + 1 / 3);
  52. g = hue2rgb(p, q, h);
  53. b = hue2rgb(p, q, h - 1 / 3);
  54. }
  55. return [r * 255, g * 255, b * 255].map((value) => value.round()).toList();
  56. }
  57. static double hue2rgb(double p, double q, double t) {
  58. if (t < 0) t += 1;
  59. if (t > 1) t -= 1;
  60. if (t < 1 / 6) return p + (q - p) * 6 * t;
  61. if (t < 1 / 2) return q;
  62. if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
  63. return p;
  64. }
  65. }
  66. class PointsUtil {
  67. static String compressPointsList(List<List<double>> points) {
  68. // print(points);
  69. String result = '';
  70. for (List<double> point in points) {
  71. result +=
  72. point[0].toStringAsFixed(4).replaceAll('0.', '').padRight(4, '0') +
  73. point[1].toStringAsFixed(4).replaceAll('0.', '').padRight(4, '0');
  74. }
  75. return result;
  76. }
  77. static List<List<double>> decompressPointsList(String compressed) {
  78. List<List<double>> result = [];
  79. for (int i = 0; i < compressed.length; i += 8) {
  80. String xString = compressed.substring(i, i + 4);
  81. String yString = compressed.substring(i + 4, i + 8);
  82. double x = double.parse(xString) / 10000;
  83. double y = double.parse(yString) / 10000;
  84. result.add([x, y]);
  85. }
  86. print(result);
  87. return result;
  88. }
  89. }