Sedgewick&Wayne的算法,练习1.2.3:
编写接受命令行参数的Interval2D客户机,
Nmin并生成max随机2d间隔,其宽度和
高度均匀分布在装置中的Nmin之间
方块字。在max上绘制并打印
相交的间隔和
彼此包含在一起。
Interval2D公开了以下API:

Interval2D(Interval1D x, Interval1D y)
boolean intersects(Interval2D)
boolean contains(Point2D)
double area()
void draw()

是否可以仅使用这些方法检查一个StdDraw是否包含在另一个Interval2D中?

最佳答案

a)了解情况:
根据1d间隔定义2d间隔a和b:

 A = Ixa x Iya = [x1a, x2a] x [y1a, y2a]
 B = Ixb x Iyb = [x1b, x2b] x [y1b, y2b]

那么
 A is contained in B, iff
 Ixa = [x1a, x2a] is contained in Ixb [x1b, x2b] and
 Iya = [y1a, y2a] is contained in Iyb = [y1b, y2b].

使用
 I1 = [a, b] is contained in I2 = [c, d] iff c <= a and b <= d.

这类似于interval2d(http://algs4.cs.princeton.edu/12oop/Interval2D.java.html)和intervall1d(http://algs4.cs.princeton.edu/12oop/Interval1D.java.html)中intersect方法的实现,只是它们测试条件的逻辑逆。
b)现在谈谈你的方法:
如果检查左下(x1a,y1a)和右上(x2a,y2a)点,则容器(点2d)应允许进行测试:
 A is contained in B, iff B contains (x1a, y1a) and B contains (x2a, y2a).

丑陋的是interval1d有getter来访问私有的左坐标和右坐标,interval2d没有getter来访问私有的x和y(一维)间隔。
您可以从toString()输出中解析它们,但这很难看,而且工作量太大。
创建一些超级类
public class Rect {
  public Interval1D x;
  public Interval1D y;
  public Interval2D r;
  Rect(Interval1D px, Interval1D py) {
    x = px;
    y = py;
    r = new Interval2D(px, py);
  }
  public boolean contains(Rect that) {
    if (!this.r.contains(new Point2D(that.x.left(), that.y.left()))) return false;
    if (!this.r.contains(new Point2D(that.x.right(), that.y.right()))) return false;
    return true;
  }
}

而且使用它很难看。

关于java - Sedgewick和Wayne的算法,练习1.2.3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17639548/

10-13 07:54