pointToCanvas method
Convert data point to canvas coordinates (optimized).
Transforms a data point from data space (x, y values) to canvas space (pixel coordinates). This method includes comprehensive validation to prevent NaN and Infinity values that could cause rendering issues.
Parameters:
point- The data point to transformsize- The size of the canvasminX,maxX,minY,maxY- The data bounds
Returns an Offset representing the canvas position, or a safe fallback position if the input is invalid.
Example
final canvasPos = pointToCanvas(
ChartDataPoint(x: 10, y: 20),
Size(400, 300),
0, 100, 0, 50,
);
canvas.drawCircle(canvasPos, 5, paint);
Implementation
Offset pointToCanvas(
ChartDataPoint point,
Size size,
double minX,
double maxX,
double minY,
double maxY,
) {
// Validate inputs
if (!point.x.isFinite || !point.y.isFinite) {
return Offset(size.width / 2, size.height / 2);
}
if (!size.width.isFinite ||
!size.height.isFinite ||
size.width <= 0 ||
size.height <= 0) {
return const Offset(0, 0);
}
if (!minX.isFinite || !maxX.isFinite || !minY.isFinite || !maxY.isFinite) {
return Offset(size.width / 2, size.height / 2);
}
// Pre-calculate ranges for better performance
final xRange = maxX - minX;
final yRange = maxY - minY;
// Avoid division by zero or invalid ranges
if (xRange <= 0 || !xRange.isFinite || yRange <= 0 || !yRange.isFinite) {
return Offset(size.width / 2, size.height / 2);
}
// Calculate coordinates with validation
final x = ((point.x - minX) / xRange) * size.width;
final y = size.height - ((point.y - minY) / yRange) * size.height;
// Validate calculated values are finite before returning
if (!x.isFinite || !y.isFinite) {
return Offset(size.width / 2, size.height / 2);
}
return Offset(x, y);
}