Java 如何删除远离线段的点?
我在这里读到了如何保持两点之间的点(即:部分线段,有一些不精确): 因此,我用Java实现了这个小算法,我的代码是(请注意,变量的名称应该清楚!) 返回的列表=新的ArrayList(点到点测试); 对于(杯c:点对点测试){ /*如果(c==段|第一点| c==段|最后点){ 继续; }*/ if(Math.abs)(Math.abs( (段\最后一个\点。getNumber(0)-段\第一个\点。getNumber(0)) * (段\第一个\点getNumber(1)-c.getNumber(1)) - (段\第一个\点。getNumber(0)-c.getNumber(0)) * (段\最后一个\点。getNumber(1)-段\第一个\点。getNumber(1)) ) / Math.sqrt( 数学.pow((段最后一个点.getNumber(0)-段第一个点.getNumber(0)),2) + 数学.pow((段最后一点.getNumber(1)-段第一点.getNumber(1)),2) ) )>最大允许距离){ 返回。删除(c); } } 返回; 为确保您理解:Java 如何删除远离线段的点?,java,algorithm,coordinates,points,Java,Algorithm,Coordinates,Points,我在这里读到了如何保持两点之间的点(即:部分线段,有一些不精确): 因此,我用Java实现了这个小算法,我的代码是(请注意,变量的名称应该清楚!) 返回的列表=新的ArrayList(点到点测试); 对于(杯c:点对点测试){ /*如果(c==段|第一点| c==段|最后点){ 继续; }*/ if(Math.abs)(Math.abs( (段\最后一个\点。getNumber(0)-段\第一个\点。getNumber(0)) * (段\第一个\点getNumber(1)-c.getNumber
返回的
是包含位于段上或段附近的点的列表(确定点是否超出段的“不精确性”/“最大距离”是变量:允许的最大距离
)点到点测试
是我的图形中存在的所有点:我的两个线段+真正在线段上的点+几乎在线段上的点(允许的最大距离
)我的小算法的想法是删除所有后者。segment_[第一个|最后一个]_点
是两个segment的末端c
是points to\u test
的当前点,我想知道它是远离段还是在段内(根据允许的最大距离
)getNumber(0)
返回点的X坐标,getNumber(1)
返回Y坐标。允许的最大距离
)
你知道我是否误解了我在这个问题的第一行给你的答案吗?你看到我自己的算法实现中有任何错误吗?注意,所引用的方法确定了与无限线的距离。如果只需要有限线段附近的点,则可以对其进行修改 在任何情况下,算法都应该找到远离直线的点。如果不这样做,请选中
a) 是否找到要删除的点
b) 是否能够从
返回的列表中删除属于测试点的对象c
编辑
寻找点与线段之间的距离是一种比较有效的方法
//版权所有2001 softSurfer,2012 Dan Sunday
//本规范可出于任何目的自由使用、分发和修改
//前提是本版权声明包含在其中。
//SoftSurfer对此代码不作任何保证,并且不能持有
//对因其使用而造成的任何实际或想象的损害负责。
//此代码的用户必须验证其应用程序的正确性。
//假设已经为对象提供了类:
//点与向量
//坐标{float x,y,z;}(对于2D,z=0)
//适当的操作员:
//点=点±向量
//向量=点-点
//向量=标量*向量
//定义端点的直线{点P0,P1;}
//具有定义端点{点P0,P1;}的段
//===================================================================
//点积(3D),允许在参数中进行向量运算
#定义点(u,v)((u).x*(v).x+(u).y*(v).y+(u).z*(v).z)
#定义范数(v)sqrt(点(v,v))//范数=向量的长度
#定义d(u,v)范数(u-v)//距离=差的范数
//dist_Point_to_Segment():获取点到线段的距离
//输入:点P和段S(任意尺寸)
//返回:从P到S的最短距离
浮动
距离点到段(点P,段S)
{
向量v=S.P1-S.P0;
向量w=P-S.P0;
双c1=点(w,v);
如果(c1),问题必然是“注意,所引用的方法确定了到无限直线的距离。如果您只需要有限线段附近的点,您会修改它。”事实上。您能告诉我删除这些点的方法吗?您还没有回答-是否if…>允许的最大距离)
condition ever fire?是的,我的问题确实只是因为忽略了段端点延伸处的点(即:未删除,因为被认为属于段)。我添加了C代码。我希望这有助于使Java功能正常运行
List<Cupple> returned = new ArrayList<>(points_to_test);
for(Cupple c : points_to_test) {
/*if(c == segment_first_point || c == segment_last_point) {
continue;
}*/
if(Math.abs(Math.abs(
(segment_last_point.getNumber(0) - segment_first_point.getNumber(0))
*
(segment_first_point.getNumber(1) - c.getNumber(1))
-
(segment_first_point.getNumber(0) - c.getNumber(0))
*
(segment_last_point.getNumber(1) - segment_first_point.getNumber(1))
)
/
Math.sqrt(
Math.pow((segment_last_point.getNumber(0) - segment_first_point.getNumber(0)), 2)
+
Math.pow((segment_last_point.getNumber(1) - segment_first_point.getNumber(1)), 2)
)
) > maximal_allowed_distance) {
returned.remove(c);
}
}
return returned;
// Copyright 2001 softSurfer, 2012 Dan Sunday
// This code may be freely used, distributed and modified for any purpose
// providing that this copyright notice is included with it.
// SoftSurfer makes no warranty for this code, and cannot be held
// liable for any real or imagined damage resulting from its use.
// Users of this code must verify correctness for their application.
// Assume that classes are already given for the objects:
// Point and Vector with
// coordinates {float x, y, z;} (z=0 for 2D)
// appropriate operators for:
// Point = Point ± Vector
// Vector = Point - Point
// Vector = Scalar * Vector
// Line with defining endpoints {Point P0, P1;}
// Segment with defining endpoints {Point P0, P1;}
//===================================================================
// dot product (3D) which allows vector operations in arguments
#define dot(u,v) ((u).x * (v).x + (u).y * (v).y + (u).z * (v).z)
#define norm(v) sqrt(dot(v,v)) // norm = length of vector
#define d(u,v) norm(u-v) // distance = norm of difference
// dist_Point_to_Segment(): get the distance of a point to a segment
// Input: a Point P and a Segment S (in any dimension)
// Return: the shortest distance from P to S
float
dist_Point_to_Segment( Point P, Segment S)
{
Vector v = S.P1 - S.P0;
Vector w = P - S.P0;
double c1 = dot(w,v);
if ( c1 <= 0 )
return d(P, S.P0);
double c2 = dot(v,v);
if ( c2 <= c1 )
return d(P, S.P1);
double b = c1 / c2;
Point Pb = S.P0 + b * v;
return d(P, Pb);
}