如何找到直线的交点?

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

cre*_*not 9

对于每个只有一个点(即从左到右只有一个图/线)的任何路径,实现此目的的最简单方法是使用二分搜索算法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 上找到完整的工作代码作为示例。