// This is a vector in some R^d. You can take its dot product with other // vectors, and destructively reflect it using them. You can also rescale it // as you like. // class Arrow // int dimension; // double coord[]; // public Arrow(int d) // public boolean dimensionAgrees(Arrow w) // public double dotProd(Arrow w) // public void reflectThrough(Arrow w) // public Arrow scaledTo(double length) import java.awt.Color; class Arrow { int dimension; long cuurd[][]; Color color; static CompostHeap compostHeap = new CompostHeap(new Arrow().getClass(), true,2); public Arrow() {} public Arrow(int d) { dimension = d; cuurd = new long[d][2]; color = Color.black; zeroOutArrow(); dbgalloc(2,"Made a zero Arrow"); } public Szam coord(int i) { return new Szam(cuurd[i][0],cuurd[i][1]); } public void getCoord(int i, Szam ans) { ans.becomesRatio(cuurd[i][0],cuurd[i][1]); } public void setCoord(int i, Szam value) { cuurd[i][0] = value.numerator; cuurd[i][1] = value.denominator; } public void reduceCuurd(int i) { long gcd = Szam.GCD(cuurd[i][0],cuurd[i][1]); if (gcd != 0) { cuurd[i][0] /= gcd; cuurd[i][1] /= gcd; } if (cuurd[i][1] < 0) { cuurd[i][0] *= -1; cuurd[i][1] *= -1; } } public void zeroOutArrow() { for (int i=0; i=4) System.out.println(s); } static public Arrow newArrow(int d) { Arrow ans; if (compostHeap.exists()) { dbgalloc(2,"Reused an Arrow!"); ans = (Arrow)compostHeap.likeNew(); ans.zeroOutArrow(); } else { dbgalloc(2,"Couldn't reuse"); ans = new Arrow(d); } return ans; } public void free() { compostHeap.recycle(this); } static public void dbgalloc(int i,String s) { if (i>=3) System.out.println(" "+s); } public boolean isZero() { boolean answer = true; for (int i=0; i1000000000) { long g = Szam.GCD(num,den); num /= g; den /= g; } } } dotprod.becomesRatio(num,den); } // public double length() // { // return Math.sqrt(this.dotProd(this).value()); // } public Arrow reflectedThrough(Arrow w) { Arrow ans = newArrow(dimension); if (dimensionAgrees(w)) { Szam scale = (Szam.TWO).times(this.dotProd(w)).over(w.dotProd(w)); ans = this.minus(w.scaleBy(scale)); // for (int i=0; i