lcsim-contrib/src/main/java/org/lcsim/contrib/onoprien/util/swim
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];