Sedgewick&Wayne的算法,练习1.2.3:
编写接受命令行参数的Interval2D
客户机,N
和min
并生成max
随机2d间隔,其宽度和
高度均匀分布在装置中的N
和min
之间
方块字。在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/