package ddddbb.comb; import java.util.HashMap; import java.util.Hashtable; import java.util.List; import java.util.Vector; import ddddbb.math.AOP; import ddddbb.math.HalfSpace; import ddddbb.math.Point; import ddddbb.math.Point3d; /** We want to have the same SpaceId for equal spaces */ public class SpaceId extends HalfSpace { static Hashtable<DSpace, SpaceId> dspaceMemo = new Hashtable<DSpace, SpaceId>(); HashMap<HalfSpace,SpaceId> memo = new HashMap<HalfSpace,SpaceId>(); //for debuggin purpose only Vector<HalfSpace> halfSpaces; SpaceId base; DSpace dspace; static SpaceId from(DSpace dspace) { SpaceId res; if (!dspaceMemo.containsKey(dspace)) { res = new SpaceId(dspace); dspaceMemo.put(dspace, res); } else { res = dspaceMemo.get(dspace); } res.spaceComputed = false; return res; } private SpaceId(DSpace _dspace) { halfSpaces = new Vector<HalfSpace>(); dspace = _dspace.clone(); } protected SpaceId() { System.out.println("n:" + dspace); halfSpaces = new Vector<HalfSpace>(); base = null; } private SpaceId(SpaceId b, Vector<HalfSpace> hs) { base = b; halfSpaces = new Vector<HalfSpace>(hs); } public SpaceId cut(HalfSpace e) { if (memo.containsKey(e)) { return memo.get(e); } SpaceId res = new SpaceId(this,halfSpaces); res.halfSpaces.add(e); memo.put(e, res); return res; } boolean spaceComputed = false; public void setHalfSpace(List<? extends OCell> facets) { assert facets.size() >= 2 : facets.size(); Point3d[] d= new Point3d[2]; Point a = null; int i=0; for (OCell fc1:facets) { Cell f1 = fc1.cell(); assert f1.location().dim() == 1; Point3d f1a,f1b; f1a = (Point3d)f1.a().location().o().clone(); f1b = (Point3d)f1.b().location().o().clone(); if (i>=2) { break; } if (i==0) { a = f1a; } d[i] = (Point3d)f1b.subtract(f1a).normalize(); i++; } normal = AOP.X(d[0],d[1]).normalize(); normal.multiply(normal.positivity()); length = a.sc(normal); spaceComputed = true; } public static void main(String[] args) { DLocation a,b,c; a = new DLocation(new int[] {0,0,0,0}, new int[] {1,2,3}); b = new DLocation(new int[] {0,0,0,0}, new int[] {3,1,2}); c = new DLocation(new int[] {0,2,1,1}, new int[] {1,2,2}); assert a.equals(b); assert ! a.equals(c); assert a.hashCode() == b.hashCode() : a.hashCode() + "," + b.hashCode(); assert a.hashCode() == c.hashCode() : a.hashCode() + "," + c.hashCode(); Hashtable<DLocation,SpaceId> ht = new Hashtable<DLocation, SpaceId>(); ht.put(a, new SpaceId()); assert ht.containsKey(b); assert ! ht.containsKey(c); HashMap<DLocation,SpaceId> hm = new HashMap<DLocation, SpaceId>(); hm.put(a,new SpaceId()); assert hm.containsKey(b); assert ! hm.containsKey(c); } }