在“细分”列表中找到最接近的值

时间:2017-04-26 20:32:37

标签: java math

我想知道如何编写一个java方法,找到最接近给定Seg段列表的Double。我无法弄清楚如何继续......任何建议或代码演示都会非常有用。

例如:假设我有一个线段 - > [X1,X2]。我需要的是返回X,如果它位于此线段上。否则,如果给定值,则返回x1或x2,在这种情况下" X"是x1或x2的最近值。示例:[2.1,4.2]。 X = 1。结果应该是2.1因为接近1。 提前致谢。这是我的代码:

public class LineSegment {

private Point p1;
private Point p2;

public Point getP1() {
    return p1;
}

public Point getP2() {
    return p2;
}

public LineSegment(Point p1, Point p2) {
    this.p1 = p1;
    this.p2 = p2;
}

// Find X or the closest value to X
private Double findNearestX(Double x, List<LineSegment> lSeg) {
    Double max = Double.MAX_VALUE;
    double closest;

    // Get X in case it's inside the list
    for (LineSegment ls : lSeg)
        if (lSeg.contains(x))
            return x;

    // otherwise...what to do next!

    return null;
}

}

1 个答案:

答案 0 :(得分:0)

似乎您正在考虑一维问题而您的Point只是一个坐标。

制作一个列表(或数组)A[]段结尾以及开始/结束属性(Coord, IsStart)

Coord字段

对其进行排序

使用二分搜索(适用于Delphi版本here之类的不精确巧合),在此列表中找到X的位置,获取两个neigbour索引,选择最接近的坐标。结果 - iBest索引

如果X位于最近端的段内,则返回X,否则结束坐标:

 if (A[iBest].IsStart and X >= A[iBest].Coord) or 
    ((not A[iBest].IsStart) and X <= A[iBest].Coord))
        return X
 else
        return A[iBest].Coord)