怎么使用点查找线

来源:爱站网时间:2021-11-18编辑:网友分享
爱站技术小编正在尝试编写一种方法,却遇到一个问题:怎么使用点查找线?经过研究学习,现在已经找到了一个合适的方法去操作,大家可以参考一下。

问题描述


我正在尝试编写一种方法,该方法将遍历具有一个起点和终点或一个起点和两个终点的轨道列表。轨道只能是垂直或水平的。它们保存在List tracks中。 getStartPoint()返回轨道的起点,getEndPoints()返回具有一个或两个元素的List

    private void findTrack(Point point) {

    }

例如:

(1,1) -> (6,1),
(6,1) -> (8,1),(6,3)
(1,1) -> (-5,1)

[3,1)点位于哪条轨道上?答案:正轨(1,1)->(6,1)。

有人可以用这种方法帮助我吗?

思路一:


最简单(尽管不是最有效的方法)是使用Line2D.contains。假设您将所有点都转换为Point2D对象:

for (Track track: tracks) {
    for (Point2D point: track.getEndPoints()) {
        Line2D line = new Line2D.Float(point, track.getStartPoint());
        if (line.contains(target))
            return track;
    }
}

思路二:


下面的解决方案将找到满足您要求的第一条轨道。如果Track可以重叠,则需要在for函数中修改findTrack循环以返回所有合格的曲目。

import java.util.Arrays; 
import java.util.List;

public class TrackTest {
public static void main(String[] args) {

    List tracks = Arrays.asList(
            new Track(new Point(1, 1), Arrays.asList(new Point(6, 1))),
            new Track(new Point(6, 1), Arrays.asList(new Point(8, 1), new Point(6, 3))),
            new Track(new Point(1, 1), Arrays.asList(new Point(-5, 1)))
    );

    Track track = findTrack(tracks, new Point(3,1));
    System.out.println("Track is " + track);
}

//find the track from a list that the point is on. null if not found
private static Track findTrack(List tracks, Point point) {
    for (Track track : tracks){
        if (inTrack(point,track)){
            return track;
        }
    }
    return null;
}

private static boolean inTrack(Point testPoint, Track track) {
    List endPoints = track.ends;
    for (Point end: endPoints){
        if (inTrack(track.start, end, testPoint)){
            return true;
        }
    }
    return false;
}
private static boolean inTrack(Point start, Point end, Point testPoint) {
    return (same(start.x, testPoint.x, end.x) && between(start.y, testPoint.y, end.y)) ||
           (same(start.y, testPoint.y, end.y) && between(start.x, testPoint.x, end.x));
}

//test if three numbers are the same.
private static boolean same(int s1, int s2, int s3) {
    return (s1 == s2) && (s2 == s3);
}

//test if s2 is between s1 and s3
private static boolean between(int s1, int s2, int s3) {
    return (s1  ends;

    public Track(Point start, List ends) {
        this.start = start;
        this.ends = ends;
    }

    @Override
    public String toString() {
        return "Track{" +
                "start=" + start +
                ", ends=" + ends +
                '}';
    }
}
}

 以上内容就是爱站技术频道小编为大家分享的怎么使用点查找线,看完以上分享之后,大家应该都知道怎么查找了吧。

上一篇:“来自套接字的“无尽” AudioInputStream是什么

下一篇:如何在春季注册FactoryBeans集合

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载