getPickerGeometry static method
Implementation
static PickerGeometry getPickerGeometry(double lightness) {
// Array of lines
var lines = Hsluv.getBounds(lightness);
var numLines = lines.length;
var outerCircleRadius = 0.0;
// Find the line closest to origin
int? closestIndex2;
double? closestLineDistance;
for (int i = 0; i < numLines; i += 1) {
var d = Geometry.distanceLineFromOrigin(lines[i]);
if (closestLineDistance == null || d < closestLineDistance) {
closestLineDistance = d;
closestIndex2 = i;
}
}
var closestLine = lines[closestIndex2!];
var perpendicularLine =
Line(slope: 0 - (1 / closestLine.slope), intercept: 0.0);
var intersectionPoint =
Geometry.intersectLineLine(closestLine, perpendicularLine);
var startingAngle = Geometry.angleFromOrigin(intersectionPoint);
var intersections = [];
var intersectionPointAngle;
for (int i1 = 0; i1 < numLines - 1; i1 += 1) {
for (int i2 = 0; i1 + 1 < numLines; i2 += 1) {
intersectionPoint = Geometry.intersectLineLine(lines[i1], lines[i2]);
intersectionPointAngle = Geometry.angleFromOrigin(intersectionPoint);
intersections.add({
"line1": i1,
"line2": i2,
"intersectionPoint": intersectionPoint,
"intersectionPointAngle": intersectionPointAngle,
"relativeAngle":
Geometry.normalizeAngle(intersectionPointAngle - startingAngle)
});
}
}
intersections.sort((a, b) {
if (a["relativeAngle"] > b["relativeAngle"]) {
return 1;
} else {
return -1;
}
});
final List<Line> orderedLines = [];
final List<Point> orderedVertices = [];
final List<double> orderedAngles = [];
var nextIndex2;
var currentIntersection;
var intersectionPointDistance;
int? currentIndex2 = closestIndex2;
var d = [];
for (int j = 0; j < intersections.length; j += 1) {
currentIntersection = intersections[j];
nextIndex2 = null;
if (currentIntersection["line1"] == currentIndex2) {
nextIndex2 = currentIntersection["line2"];
} else if (currentIntersection["line2"] == currentIndex2) {
nextIndex2 = currentIntersection["line1"];
}
if (nextIndex2 != null) {
currentIndex2 = nextIndex2;
d.add(currentIndex2);
orderedLines.add(lines[nextIndex2]);
orderedVertices.add(currentIntersection["intersectionPoint"]);
orderedAngles.add(currentIntersection["intersectionPointAngle"]);
intersectionPointDistance = Geometry.distanceFromOrigin(
currentIntersection["intersectionPoint"]);
if (intersectionPointDistance > outerCircleRadius) {
outerCircleRadius = intersectionPointDistance;
}
}
}
return PickerGeometry(
lines: orderedLines,
vertices: orderedVertices,
angles: orderedAngles,
outerCircleRadius: outerCircleRadius,
innerCircleRadius: closestLineDistance,
);
}