Print

Print


Commit in lcsim-contrib/src/main/java/org/lcsim/contrib/onoprien/util/swim on MAIN
Line.java+14-61.4 -> 1.5
Implement intersection of Line with generalized ZCylinder.
Minor changes to calorimeter module/layer classes.

lcsim-contrib/src/main/java/org/lcsim/contrib/onoprien/util/swim
Line.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- Line.java	26 Mar 2009 20:58:41 -0000	1.4
+++ Line.java	27 Mar 2009 04:47:38 -0000	1.5
@@ -8,7 +8,7 @@
  * Straight line {@link Trajectory}.
  *
  * @author D. Onoprienko
- * @version $Id: Line.java,v 1.4 2009/03/26 20:58:41 onoprien Exp $
+ * @version $Id: Line.java,v 1.5 2009/03/27 04:47:38 onoprien Exp $
  */
 public class Line extends AbstractTrajectory {
   
@@ -144,6 +144,8 @@
       return intersect((Poca) surface);
     } else if (surface instanceof PocaXY) {
       return intersect((PocaXY) surface);
+    } else if (surface instanceof ZDisk) {
+      return intersect((ZDisk) surface);
     } else if (surface instanceof ZPlane) {
       return intersect((ZPlane) surface);
     } else if (surface instanceof ZCylinder) {
@@ -182,15 +184,21 @@
   }
   
   public Intersection intersect(ZCylinder zCylinder) {
-    double d2 = _dir.x() * _dir.x() + _dir.y() * _dir.y();
-    if (d2 == 0.) return new IntersectionNone(this, zCylinder);
-    double b = _orig.x() * _dir.x() + _orig.y() * _dir.y();
-    double discr = b*b - d2 * (_orig.x() * _orig.x() + _orig.y() * _orig.y() - zCylinder._r * zCylinder._r);
+
+    double r = zCylinder.getRadius();
+    Hep3Vector center = zCylinder.getCenter();
+    double x = _orig.x() - center.x();
+    double y = _orig.y() - center.y();
+
+    double a = _dir.x() * _dir.x() + _dir.y() * _dir.y();
+    if (a == 0.) return new IntersectionNone(this, zCylinder);
+    double b = x*_dir.x() + y*_dir.y();
+    double discr = b*b - a * (x*x + y*y - r*r);
     if ((discr < 0.) || Double.isNaN(discr) || Double.isInfinite(discr)) {
       return new IntersectionNone(this, zCylinder);
     } else {
       discr = Math.sqrt(discr);
-      double[] ss = new double[] { (-b - discr) / d2, (-b + discr) / d2};
+      double[] ss = new double[] { (-b - discr) / a, (-b + discr) / a};
       boolean[] good = new boolean[2];
       for (int i=0; i<2; i++) {
         double s = ss[i];
CVSspam 0.2.8