00001 00002 00003 #include "DataFormats/GeometrySurface/interface/Cylinder.h" 00004 #include "DataFormats/GeometrySurface/interface/TangentPlane.h" 00005 #include "DataFormats/GeometrySurface/interface/GeomExceptions.h" 00006 00007 #include <cfloat> 00008 00009 Surface::Side Cylinder::side( const LocalPoint& p, Scalar toler) const 00010 { 00011 Scalar lz = p.perp() - radius(); 00012 return (fabs(lz)<toler ? SurfaceOrientation::onSurface : 00013 (lz>0 ? SurfaceOrientation::positiveSide : SurfaceOrientation::negativeSide)); 00014 } 00015 00016 ReferenceCountingPointer<TangentPlane> 00017 Cylinder::tangentPlane (const LocalPoint& aPoint) const 00018 { 00019 return tangentPlane(toGlobal(aPoint)); 00020 } 00021 00022 ReferenceCountingPointer<TangentPlane> 00023 Cylinder::tangentPlane (const GlobalPoint& aPoint) const 00024 { 00025 // 00026 // Tangent plane at specified point. In order to avoid 00027 // possible numerical problems currently no attempt is made 00028 // to verify, if the point is actually on the cylinder. 00029 // 00030 // local y parallel to axis 00031 GlobalVector yPlane(toGlobal(LocalVector(0.,0.,1.))); 00032 // local x normal to y and a vector linking the specified 00033 // point with the axis 00034 GlobalVector xPlane(yPlane.cross(aPoint-position())); 00035 Scalar size = xPlane.mag(); 00036 if ( size<FLT_MIN ) 00037 throw GeometryError("Attempt to construct TangentPlane on cylinder axis"); 00038 xPlane /= size; 00039 // // local z defined by x and y (should point outwards from axis) 00040 // GlobalVector zPlane(xPlane.cross(yPlane)); 00041 00042 return ReferenceCountingPointer<TangentPlane>(new TangentPlane(aPoint, 00043 RotationType(xPlane, 00044 yPlane), 00045 this)); 00046 }