0

假设我有一个点 (0,0),我说它将用作原点。如何检查以下点(在数组中)是否基于原点共享相同的斜率。

要点是:

(6000, 7000) (10000, 0) (16000, 17000) (7000, 3000) 
(3000, 7000) (20000, 21000) (3000, 4000) (0, 10000).

基本上我想比较每个点相对于原点,看看哪些点具有相同的斜率,并将这些点组合在单独的列表中。我只是对它背后的算法和逻辑有点困惑。我知道 for 循环是最好的,但它的实现似乎离我越来越远了

   for (int j = 0; j < array.length - 1; i++)

这就是我开始失去理智的地方。

4

2 回答 2

1

您描述的方法是正确的。您想要“查看哪些共享相同的斜率并将这些点组合在单独的列表中”。

您可以使用 aMap为您处理分组,例如:

Map<BigDecimal, List<Point>> lists = new HashMap<BigDecimal, List<Point>>();
for (Point point : points) {
    BigDecimal slope = new BigDecimal(point.getY()).divide(new BigDecimal(point.getX()));
    List<Point> list = lists.get(slope);
    if (list == null) {
        list = new ArrayList<Point>();
        lists.put(slope, list);
    }
    list.add(point);
}

请注意,这使用了任意精度BigDecimal类来避免与原始浮点类型舍入相关的问题。如果你不关心这个,你可以使用Doubleanddouble代替。

于 2012-10-07T06:07:34.700 回答
0

创建点列表,迭代列表,计算斜率并根据地图中每个计算的斜率维护点列表,如下所示:

        List<int[]> myPoints = new ArrayList<int[]>();
        int[] point1 = new int[]{6000, 7000};
        myPoints.add(point1);
        int[] point2 = new int[]{10000, 0};
        myPoints.add(point2);
        int[] point3 = new int[]{16000, 17000};
        myPoints.add(point3);

        Map<Float, List<int[]>> myMatchingSlopePoints = new HashMap<Float, List<int[]>>();
        for(int[] point: myPoints){
            Float slope = new Float(point[1]/point[0]);
            if(myMatchingSlopePoints.get(slope) == null){
                //create a new list as this slope doesn't match with previous one
                myMatchingSlopePoints.put(slope, new ArrayList<int[]>());
            }
            //add the slope to match list
            myMatchingSlopePoints.get(slope).add(point);
        }

        //retrieve various slope
        Set<Float> variousFloats = myMatchingSlopePoints.keySet();

        //retrieve mathing points for each slope
        for(Float slope: variousFloats){
            List<int[]> matchingPointsListForSlope = myMatchingSlopePoints.get(slope);
            //use matching points
        }
于 2012-10-07T06:21:45.083 回答