/*
* $Id$
*/
package edu.jas.root;
import java.io.Serializable;
import edu.jas.arith.BigDecimal;
import edu.jas.arith.BigRational;
import edu.jas.arith.Rational;
import edu.jas.poly.Complex;
import edu.jas.poly.ComplexRing;
import edu.jas.structure.ElemFactory;
import edu.jas.structure.RingElem;
import edu.jas.structure.GcdRingElem;
import edu.jas.structure.RingFactory;
/**
* Rectangle. For example isolating rectangle for complex roots.
* @param coefficient type.
* @author Heinz Kredel
*/
public class Rectangle & Rational> implements Serializable {
/**
* rectangle corners.
*/
public final Complex[] corners;
/**
* Constructor.
* @param c array of corners.
*/
@SuppressWarnings("unchecked")
/*package*/ Rectangle(Complex[] c) {
if (c.length < 5) {
corners = (Complex[]) new Complex[5];
for (int i = 0; i < 4; i++) {
corners[i] = c[i];
}
} else {
corners = c;
}
if (corners[4] == null) {
corners[4] = corners[0];
}
}
/**
* Constructor.
* @param mid corner.
*/
@SuppressWarnings("unchecked")
public Rectangle(Complex mid) {
this(mid, mid);
}
/**
* Constructor.
* @param sw corner.
* @param ne corner.
*/
@SuppressWarnings("unchecked")
public Rectangle(Complex sw, Complex ne) {
this(new Complex(sw.ring, sw.getRe(), ne.getIm()), sw, new Complex(sw.ring, ne.getRe(),
sw.getIm()), ne);
}
/**
* Constructor.
*
* nw|0 ne|3
* sw|1 se|2
*
* @param nw corner.
* @param sw corner.
* @param se corner.
* @param ne corner.
*/
@SuppressWarnings("unchecked")
public Rectangle(Complex nw, Complex sw, Complex se, Complex ne) {
this((Complex[]) new Complex[] { nw, sw, se, ne });
}
/**
* String representation of Rectangle.
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
//return "[" + corners[0] + ", " + corners[1] + ", " + corners[2] + ", " + corners[3] + "]";
return "[" + corners[1] + ", " + corners[3] + "]";
//return centerApprox() + " = [" + corners[0] + ", " + corners[1] + ", " + corners[2] + ", " + corners[3] + "]";
}
/**
* Get a scripting compatible string representation.
* @return script compatible representation for this Rectangle.
*/
public String toScript() {
// Python case
//return "(" + corners[0] + ", " + corners[1] + ", " + corners[2] + ", " + corners[3] + ")";
return "(" + corners[1].toScript() + ", " + corners[3].toScript() + ")";
}
/**
* Get north west corner.
* @return north west corner of this rectangle.
*/
public Complex getNW() {
return corners[0];
}
/**
* Get south west corner.
* @return south west corner of this rectangle.
*/
public Complex getSW() {
return corners[1];
}
/**
* Get south east corner.
* @return south east corner of this rectangle.
*/
public Complex getSE() {
return corners[2];
}
/**
* Get north east corner.
* @return north east corner of this rectangle.
*/
public Complex getNE() {
return corners[3];
}
/**
* Exchange NW corner.
* @param c new NW corner.
* @return rectangle with north west corner c of this rectangle.
*/
public Rectangle exchangeNW(Complex c) {
Complex d = getSE();
Complex sw = new Complex(c.factory(), c.getRe(), d.getIm());
Complex ne = new Complex(c.factory(), d.getRe(), c.getIm());
return new Rectangle(c, sw, d, ne);
}
/**
* Exchange SW corner.
* @param c new SW corner.
* @return rectangle with south west corner c of this rectangle.
*/
public Rectangle exchangeSW(Complex c) {
Complex d = getNE();
Complex nw = new Complex(c.factory(), c.getRe(), d.getIm());
Complex se = new Complex(c.factory(), d.getRe(), c.getIm());
return new Rectangle(nw, c, se, d);
}
/**
* Exchange SE corner.
* @param c new SE corner.
* @return rectangle with south east corner c of this rectangle.
*/
public Rectangle exchangeSE(Complex c) {
Complex d = getNW();
Complex sw = new Complex(c.factory(), d.getRe(), c.getIm());
Complex ne = new Complex(c.factory(), c.getRe(), d.getIm());
return new Rectangle(d, sw, c, ne);
}
/**
* Exchange NE corner.
* @param c new NE corner.
* @return rectangle with north east corner c of this rectangle.
*/
public Rectangle exchangeNE(Complex c) {
Complex d = getSW();
Complex nw = new Complex(c.factory(), d.getRe(), c.getIm());
Complex se = new Complex(c.factory(), c.getRe(), d.getIm());
return new Rectangle(nw, d, se, c);
}
/**
* Contains a point.
* @param c point.
* @return true if c is contained in this rectangle, else false.
*/
public boolean contains(Complex c) {
Complex ll = getSW();
Complex ur = getNE(); // ?? Fix ?? getSW();
C cre = c.getRe();
C cim = c.getIm();
return cre.compareTo(ll.getRe()) >= 0 && cim.compareTo(ll.getIm()) >= 0
&& cre.compareTo(ur.getRe()) <= 0 && cim.compareTo(ur.getIm()) <= 0;
}
/**
* Contains a rectangle.
* @param r rectangle.
* @return true if r is contained in this rectangle, else false.
*/
public boolean contains(Rectangle r) {
return contains(r.getSW()) && contains(r.getNE()); // && contains(r.getSE()) && contains(r.getNW())
}
/**
* Random point of recatangle.
* @return a random point contained in this rectangle.
*/
public Complex randomPoint() {
Complex sw = getSW();
Complex se = getSE();
Complex nw = getNW();
Complex r = sw.factory().random(13);
C dr = se.getRe().subtract(sw.getRe()); // >= 0
C di = nw.getIm().subtract(sw.getIm()); // >= 0
C rr = r.getRe().abs();
C ri = r.getIm().abs();
C one = ((RingFactory) dr.factory()).getONE();
if (!rr.isZERO()) {
if (rr.compareTo(one) > 0) {
rr = rr.inverse();
}
}
if (!ri.isZERO()) {
if (ri.compareTo(one) > 0) {
ri = ri.inverse();
}
}
// 0 <= rr, ri <= 1
rr = rr.multiply(dr);
ri = ri.multiply(di);
Complex rp = new Complex(sw.factory(), rr, ri);
//System.out.println("rp = " + rp);
rp = sw.sum(rp);
return rp;
}
/**
* Copy this.
* @return a copy of this.
*/
public Rectangle copy() {
return new Rectangle(corners);
}
/**
* Comparison with any other object.
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
@SuppressWarnings("unchecked")
public boolean equals(Object b) {
if (!(b instanceof Rectangle)) {
return false;
}
Rectangle a = null;
try {
a = (Rectangle) b;
} catch (ClassCastException e) {
}
for (int i = 0; i < 4; i++) {
if (!corners[i].equals(a.corners[i])) {
return false;
}
}
return true;
}
/**
* Hash code for this Rectangle.
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
int hc = 0;
for (int i = 0; i < 3; i++) {
hc += 37 * corners[i].hashCode();
}
return 37 * hc + corners[3].hashCode();
}
/**
* Complex center.
* @return r + i m of the center.
*/
public Complex getCenter() {
C r = corners[2].getRe().subtract(corners[1].getRe());
C m = corners[0].getIm().subtract(corners[1].getIm());
ElemFactory rf = r.factory();
C two = rf.fromInteger(2);
r = r.divide(two);
m = m.divide(two);
r = corners[1].getRe().sum(r);
m = corners[1].getIm().sum(m);
return new Complex(corners[0].factory(), r, m);
}
/**
* Complex of BigRational approximation of center.
* @return r + i m as rational approximation of the center.
*/
public Complex getRationalCenter() {
Complex cm = getCenter();
BigRational rs = cm.getRe().getRational();
BigRational ms = cm.getIm().getRational();
ComplexRing cf = new ComplexRing(rs.factory());
Complex c = new Complex(cf, rs, ms);
return c;
}
/**
* Complex of BigDecimal approximation of center.
* @return r + i m as decimal approximation of the center.
*/
public Complex getDecimalCenter() {
Complex rc = getRationalCenter();
BigDecimal rd = new BigDecimal(rc.getRe());
BigDecimal md = new BigDecimal(rc.getIm());
ComplexRing cf = new ComplexRing(rd.factory());
Complex c = new Complex(cf, rd, md);
return c;
}
/**
* Approximation of center.
* @return r + i m as string of decimal approximation of the center.
*/
public String centerApprox() {
Complex c = getDecimalCenter();
StringBuffer s = new StringBuffer();
s.append("[ ");
s.append(c.getRe().toString());
s.append(" i ");
s.append(c.getIm().toString());
s.append(" ]");
return s.toString();
}
/**
* Length.
* @return |ne-sw|**2;
*/
public C length() {
Complex m = corners[3].subtract(corners[1]);
return m.norm().getRe();
}
/**
* Rational Length.
* @return rational(|ne-sw|**2);
*/
public BigRational rationalLength() {
//BigRational r = new BigRational(length().toString());
return length().getRational();
}
/**
* Length real side.
* @return |re(ne)-re(sw)|;
*/
public C lengthReal() {
C m = corners[3].getRe().subtract(corners[1].getRe());
return m.abs();
}
/**
* Length imaginary side.
* @return |im(ne)-im(sw)|;
*/
public C lengthImag() {
C m = corners[3].getIm().subtract(corners[1].getIm());
return m.abs();
}
}
Ads help maintain this website.