gpt4 book ai didi

java - 计算沿线最接近其他点的距离(又名 "project")

转载 作者:行者123 更新时间:2023-11-30 07:04:39 29 4
gpt4 key购买 nike

我有一个由许多点组成的LineString(坐标字符串),我想计算沿线最近的距离(从第一个点到最后一个点,方向性很重要)到一个,就像这样说的:"project()" calculation

如果我不必使用任何第三方库,那就太好了,我意识到有些第三方库可以轻松做到这一点。

最佳答案

线性引用正是您所寻找的。从您的评论来看,这听起来确实很复杂,但当您将其分解然后只需添加一个循环来遍历您的点以计算出最近的段时,它仍然是一个非常简单的数学/代码。

下面是从谷歌搜索中提取的一段不错的代码......您可以使用它来查找线段上最近的点:Util.getClosestPointOnSegment(Point ss, Point se, Point p)

代码:

import java.awt.Point;

public class Util{

/**
* Returns closest point on segment to point
* @param ss - segment start point
* @param se - segment end point
* @param p - point to found closest point on segment
* @return closest point on segment to p
*/
public static Point getClosestPointOnSegment(Point ss, Point se, Point p)
{
return getClosestPointOnSegment(ss.x, ss.y, se.x, se.y, p.x, p.y);
}

/**
* Returns closest point on segment to point
* @param sx1 - segment x coord 1
* @param sy1 - segment y coord 1
* @param sx2 - segment x coord 2
* @param sy2 - segment y coord 2
* @param px - point x coord
* @param py - point y coord
* @return closets point on segment to point
*/
public static Point getClosestPointOnSegment(int sx1, int sy1, int sx2, int sy2, int px, int py)
{
double xDelta = sx2 - sx1;
double yDelta = sy2 - sy1;

if ((xDelta == 0) && (yDelta == 0))
{
throw new IllegalArgumentException("Segment start equals segment end");
}

double u = ((px - sx1) * xDelta + (py - sy1) * yDelta) / (xDelta * xDelta + yDelta * yDelta);

final Point closestPoint;
if (u < 0)
{
closestPoint = new Point(sx1, sy1);
}
else if (u > 1)
{
closestPoint = new Point(sx2, sy2);
}
else
{
closestPoint = new Point((int) Math.round(sx1 + u * xDelta), (int) Math.round(sy1 + u * yDelta));
}
return closestPoint;
}
}

显然,您仍然需要编写一些代码来计算出要检查的最接近的段,并仍然添加长度,但这将帮助您开始。

示例取自:

http://www.java2s.com/Code/Java/2D-Graphics-GUI/Returnsclosestpointonsegmenttopoint.htm

关于java - 计算沿线最接近其他点的距离(又名 "project"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40352842/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com