123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- import 'dart:convert';
- import 'dart:math';
- import 'package:flutter/material.dart';
- import 'package:crypto/crypto.dart';
- class ColorUtil {
- static Color generateColor(String uuid) {
- final hash = sha256.convert(utf8.encode(uuid)).toString();
- final intHash = int.parse(hash.substring(hash.length - 10), radix: 16);
- final Random random = Random(intHash);
- final double r = random.nextInt(256).toDouble();
- final double g = random.nextInt(256).toDouble();
- final double b = random.nextInt(256).toDouble();
- List<double> hsl = rgbToHsl(r, g, b);
- List<int> rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
- return Color.fromRGBO(
- rgb[0],
- rgb[1],
- rgb[2],
- 1,
- );
- }
- static List<double> rgbToHsl(double r, double g, double b) {
- r /= 255;
- g /= 255;
- b /= 255;
- double max1 = max(max(r, g), b);
- double min1 = min(min(r, g), b);
- double h = 0;
- if (max1 == min1) {
- h = 0; // achromatic
- } else {
- double d = max1 - min1;
- if (max1 == r) {
- h = (g - b) / d + (g < b ? 6 : 0);
- } else if (max1 == g) {
- h = (b - r) / d + 2;
- } else if (max1 == b) {
- h = (r - g) / d + 4;
- }
- h /= 6;
- }
- return [h, 0.8, 0.5];
- }
- static List<int> hslToRgb(double h, double s, double l) {
- double r, g, b;
- if (s == 0) {
- r = g = b = l; // achromatic
- } else {
- double q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- double p = 2 * l - q;
- r = hue2rgb(p, q, h + 1 / 3);
- g = hue2rgb(p, q, h);
- b = hue2rgb(p, q, h - 1 / 3);
- }
- return [r * 255, g * 255, b * 255].map((value) => value.round()).toList();
- }
- static double hue2rgb(double p, double q, double t) {
- if (t < 0) t += 1;
- if (t > 1) t -= 1;
- if (t < 1 / 6) return p + (q - p) * 6 * t;
- if (t < 1 / 2) return q;
- if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
- return p;
- }
- }
- class PointsUtil {
- static String compressPointsList(List<List<double>> points) {
- // print(points);
- String result = '';
- for (List<double> point in points) {
- result +=
- point[0].toStringAsFixed(4).replaceAll('0.', '').padRight(4, '0') +
- point[1].toStringAsFixed(4).replaceAll('0.', '').padRight(4, '0');
- }
- return result;
- }
- static List<List<double>> decompressPointsList(String compressed) {
- List<List<double>> result = [];
- for (int i = 0; i < compressed.length; i += 8) {
- String xString = compressed.substring(i, i + 4);
- String yString = compressed.substring(i + 4, i + 8);
- double x = double.parse(xString) / 10000;
- double y = double.parse(yString) / 10000;
- result.add([x, y]);
- }
- print(result);
- return result;
- }
- }
|