是在一个平面,比如一个长方形(或窗口)内,找到这个圆的所有点的集合。我知道这个公式, (Y - y0)^2 + (X - x0)^2 = r^2,但显然不能穷举窗口内的所有点,来一个个作判断是否满足条件,这样的话,运行时间太久了,因为要做很多这样的运算。有什么更好的办法么?我想到的是,从圆心开始,分割四个区域,每个区域,从圆心向上(下)左(右)一个一个的试每一个点。不知道是否有更有效率的法子。谢谢。

解决方案 »

  1.   

    分上下两部分  以圆心为(0,0)
    若(x,y)在园边上
    (x,y)和(x,-y)还有区间里所有的点都满足
      

  2.   


    /**
     * 
     */
    package test;import java.text.ParseException;
    import java.util.ArrayList;
    import java.util.List;/**
     * 
     * @author - yy
     * @time   - Dec 9, 2008 3:44:38 PM
     */
    public class Test5 {
      
      /**
       * @param args
       * @throws ParseException 
       */
      public static void main(String[] args) throws ParseException {
        List<Point> list = new Test5().genPointList(new Point(2, 1), 2);
        System.out.println(list);
        // 输出结果
    //    [(2,1)
    //     , (2,1)
    //     , (1,1)
    //     , (3,1)
    //     , (1,1)
    //     , (3,1)
    //     , (0,1)
    //     , (4,1)
    //     , (0,1)
    //     , (4,1)
    //     , (2,2)
    //     , (2,0)
    //     , (1,2)
    //     , (3,2)
    //     , (1,0)
    //     , (3,0)
    //     , (2,3)
    //     , (2,-1)
    //     ]
      }
      
      public List<Point> genPointList(Point org, int radius) throws ParseException {
        List<Point> list = new ArrayList<Point>();
        for (int y = 0; y <= radius; y++) { // 从一个轴的计算
          int maxRelativeX = (int) Math.sqrt(radius * radius - y * y);
          list.add(new Point(org.getX(), org.getY() + y));
          list.add(new Point(org.getX(), org.getY() - y));
          for (int i = 1; i <= maxRelativeX; i++) {
            list.add(new Point(org.getX() - i, org.getY() + y)); // 四个方位都合适
            list.add(new Point(org.getX() + i, org.getY() + y));
            list.add(new Point(org.getX() - i, org.getY() - y));
            list.add(new Point(org.getX() + i, org.getY() - y));
          }
        }
        return list;
      }
      
    }class Point {
      private int x;
      private int y;
      
      public Point(int x, int y) {
        this.x = x;
        this.y = y;
      }
      
      public int getX() {
        return this.x;
      }
      
      public void setX(int x) {
        this.x = x;
      }
      
      public int getY() {
        return this.y;
      }
      
      public void setY(int y) {
        this.y = y;
      }
      
      @Override
      public String toString() { // AutoGenerate
        StringBuilder sb = new StringBuilder();
        sb.append("(").append(this.x);
        sb.append(",").append(this.y);
        sb.append(")\n");
        return sb.toString();
      }
      
    }
      

  3.   

    ParseException异常不需要,以前留下的,忘记删除了
      /**
       * 计算满足条件的所有点
       * @param org - 圆点(x0,y0)
       * @param radius - 半径
       * @return
       */
       public List<Point> genPointList(Point org, int radius)
      

  4.   


          // 将genPointList中的以下两句注释掉
          //list.add(new Point(org.getX(), org.getY() + y));
          //list.add(new Point(org.getX(), org.getY() - y));      //  改为
          list.add(new Point(org.getX(), org.getY() + y));
          if(y!=0) {
           list.add(new Point(org.getX(), org.getY() - y));
          }