cre*_*not 4 graphics 2d canvas dart flutter
如果我在 Flutter 中有以下图表:
如果绿色图是Path具有多个lineTo线段的对象,如何找到具有给定 x 坐标的点的 y 坐标?
正如您在图像中看到的,x 轴上的特定点有一条灰色虚线,我想在它与绿色图形相交的地方画一个点。
这是一个示例路径:
final path = Path();
path.moveTo(0, 200);
path.lineTo(10, 210);
path.lineTo(30, 190);
path.lineTo(55, 150);
path.lineTo(80, 205);
path.lineTo(100, 0);
Run Code Online (Sandbox Code Playgroud)
我想找到 处的点的 y 坐标dx = 75。
对于每个只有一个点(即从左到右只有一个图/线)的任何路径,实现此目的的最简单方法是使用二分搜索算法。x
然后,您可以简单地使用通过 获得的路径距离Path.computeMetrics来执行二分搜索并通过 查找偏移量Path.getTangentForOffset:
const searchDx = 75;
const iterations = 12;
final pathMetric = path.computeMetrics().first;
final pathDistance = pathMetric.length;
late Offset closestOffset;
var closestDistance = pathDistance / 2;
for (var n = 1; n <= iterations; n++) {
closestOffset = pathMetric.getTangentForOffset(closestDistance)!.position;
if (closestOffset.dx == searchDx) break;
final change = pathDistance / pow(2, n);
if (closestOffset.dx < searchDx) {
closestDistance += change;
} else {
closestDistance -= change;
}
}
print(closestOffset); // Offset(75.0, 193.9)
Run Code Online (Sandbox Code Playgroud)
请注意,如果您想运行更多的迭代(由于二分搜索的性质,这不是必需的),您应该替换final change = pathDistance / pow(2, n);为更便宜的操作,例如存储当前搜索间隔的左点和右点。
您可以在 Dartpad 上找到完整的工作代码作为示例。