Java 如何删除远离线段的点?

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

我在这里读到了如何保持两点之间的点(即:部分线段,有一些不精确):

因此,我用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); } } 返回; 为确保您理解:

  • 返回的
    是包含位于段上或段附近的点的列表(确定点是否超出段的“不精确性”/“最大距离”是变量:
    允许的最大距离

  • 点到点测试
    是我的图形中存在的所有点:我的两个线段+真正在线段上的点+几乎在线段上的点(
    允许的最大距离
    我的小算法的想法是删除所有后者。

  • 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);
    }