<> <> <> DIRECTORY CastRays, CSG, DisplayList3d, IO, Polynomial, Rope, SV2d, SV3d, SVModelTypes, SVRayTypes, SVSceneTypes, TFI3d; SteinerClassImpl: PROGRAM IMPORTS CastRays, CSG, DisplayList3d, IO, Polynomial, TFI3d EXPORTS = BEGIN Camera: TYPE = SVModelTypes.Camera; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = SV3d.Point3d; Shape: TYPE = SVSceneTypes.Shape; Vector: TYPE = SV3d.Vector; <> Assembly: TYPE = SVSceneTypes.Assembly; Classification: TYPE = SVRayTypes.Classification; Composite: TYPE = SVRayTypes.Composite; MasterObject: TYPE = SVSceneTypes.MasterObject; MasterObjectClass: TYPE = SVSceneTypes.MasterObjectClass; MasterObjectClassList: TYPE = SVSceneTypes.MasterObjectClassList; -- LIST OF MasterObjectClass Primitive: TYPE = SVRayTypes.Primitive; Ray: TYPE = SVRayTypes.Ray; globalPoly: Polynomial.Ref; steinerClass: MasterObjectClass; SteinerCast: PUBLIC PROC [cameraPoint: Point2d, localRay: Ray, masterObject: REF ANY, prim: Primitive] RETURNS [class: Classification] = { <> << 2 2 2 2 2 2 F(x,y,z) = y z + x z - 2 x y z + x y = 0 >> <> realRoots: Polynomial.ShortRealRootRec; -- optional <> <> <> x0, x1, y0, y1, z0, z1, x1y1: REAL; x0x0, x1x1, y0y0, y1y1, z0z0, z1z1: REAL; x0x1, y0y1, x0y0, x0y1, x1y0: REAL; a4,a3,a2,a1,a0: REAL; p: Point3d; d: Vector; SteinerGrad: PROC [x, y, z: REAL] RETURNS [Vector] ~ { gradx, grady, gradz: REAL; gradx _ 2. * ( x * z * z - y * z + x * y * y ); grady _ 2. * ( y * z * z - x * z + x * x * y ); gradz _ 2. * ( y * y * z + x * x * z - x * y ); RETURN [[gradx, grady, gradz]]; }; class _ CastRays.GetClassFromPool[]; <> [p, d] _ CSG.GetLocalRay[localRay]; -- p is base point, d is directiona x0 _ p[1]; x1 _ d[1]; y0 _ p[2]; y1 _ d[2]; z0 _ p[3]; z1 _ d[3]; x0x0 _ x0 * x0; x1x1 _ x1 * x1; y0y0 _ y0 * y0; y1y1 _ y1 * y1; z0z0 _ z0 * z0; z1z1 _ z1 * z1; x0x1 _ x0 * x1; y0y1 _ y0 * y1; x0y0 _ x0 * y0; x0y1 _ x0 * y1; x1y0 _ x1 * y0; <> <<>> <<>> << F, x: x1 * t + x0, y: y1 * t + y0, z: z1 * t + z0; >> <<>> << in Macsyma:>> <<>> << 2 2 2 2 2 4 (d20)/R/ ((y1 + x1 ) z1 + x1 y1 ) t 2 2 2 2 + ((2 y0 y1 + 2 x0 x1) z1 + ((2 y1 + 2 x1 ) z0 - 2 x1 y1) z1 + 2 x0 x1 y1 2 3 2 2 2 + 2 x1 y0 y1) t + ((y0 + x0 ) z1 + ((4 y0 y1 + 4 x0 x1) z0 - 2 x0 y1 2 2 2 2 2 - 2 x1 y0) z1 + (y1 + x1 ) z0 - 2 x1 y1 z0 + x0 y1 + 4 x0 x1 y0 y1 2 2 2 2 2 2 + x1 y0 ) t + (((2 y0 + 2 x0 ) z0 - 2 x0 y0) z1 + (2 y0 y1 + 2 x0 x1) z0 2 2 2 2 2 + (- 2 x0 y1 - 2 x1 y0) z0 + 2 x0 y0 y1 + 2 x0 x1 y0 ) t + (y0 + x0 ) z0 2 2 - 2 x0 y0 z0 + x0 y0 >> a4 _ (y1y1 + x1x1 ) * z1z1 + x1x1 * y1y1 ; a3 _ (2.*y0y1+2.*x0x1) * z1z1 + ((2.*y1y1 + 2.*x1x1)*z0 - 2.*x1y1)*z1 + 2.*x0x1*y1y1+ 2.*x1x1*y0y1 ; a2 _ (y0y0 + x0x0 )*z1z1 + ((4.*y0y1 + 4.*x0x1)*z0 - 2.*x0y1 - 2.*x1y0)*z1 + (y1y1 + x1x1 )*z0z0 - 2.*x1y1*z0 + x0x0*y1y1 + 4.*x0x1*y0y1 + x1x1 * y0y0; a1 _ ((2.*y0y0 + 2.*x0x0)*z0 - 2.*x0y0)*z1 + (2.*y0y1 + 2.*x0x1)*z0z0 + (-2.*x0y1 - 2.*x1y0)*z0 + 2.*x0x0*y0y1 + 2.*x0x1*y0y0; a0 _ (y0y0 + x0x0 )*z0z0 - 2.*x0y0*z0 + x0x0*y0y0 ; realRoots _ PositiveRoots[1.0, a3/a4, a2/a4, a1/a4, a0/a4]; <<>> SELECT realRoots.nRoots FROM <