@@ -2889,4 +2889,113 @@ fn cone_vs_plane_test() {
28892889 let cv = normalize ( cp2-cp1) ;
28902890 let h = dist ( cp1, cp2) ;
28912891 assert_eq ! ( cone_vs_plane( cp1, cv, h, r, x, n) , Classification :: Intersects ) ;
2892+ }
2893+
2894+ #[ test]
2895+ fn capsule_vs_plane_test ( ) {
2896+ // use a simple plane at 0,0,0 +z
2897+ let x = Vec3f :: zero ( ) ;
2898+ let n = Vec3f :: unit_z ( ) ;
2899+
2900+ // behind
2901+ /*
2902+ +z
2903+ ^
2904+ |
2905+ --------------------- +x (0, 0, 0)
2906+ cp2 (5,-1)
2907+ cp1 (0,-5)
2908+ */
2909+
2910+ let cp1 = Vec3f :: new ( 0.0 , 0.0 , -5.0 ) ;
2911+ let cp2 = Vec3f :: new ( 5.0 , 0.0 , -1.0 ) ;
2912+ let r = 0.5 ;
2913+ assert_eq ! ( capsule_vs_plane( cp1, cp2, r, x, n) , Classification :: Behind ) ;
2914+
2915+ // infront
2916+ /*
2917+ +z
2918+ ^ cp2 (2,2)
2919+ | cp1 (1,1)
2920+ --------------------- +x (0, 0, 0)
2921+ */
2922+
2923+ let cp1 = Vec3f :: new ( 1.0 , 0.0 , 1.0 ) ;
2924+ let cp2 = Vec3f :: new ( 2.0 , 0.0 , 2.0 ) ;
2925+ let r = 0.5 ;
2926+ assert_eq ! ( capsule_vs_plane( cp1, cp2, r, x, n) , Classification :: Infront ) ;
2927+
2928+
2929+ // intersect fully through the line seg
2930+ /*
2931+ +z
2932+ ^ cp2 (5,5)
2933+ |
2934+ --------------------- +x (0, 0, 0)
2935+
2936+ cp1 (0,-1)
2937+ */
2938+
2939+ let cp1 = Vec3f :: new ( 0.0 , 0.0 , -1.0 ) ;
2940+ let cp2 = Vec3f :: new ( 5.0 , 0.0 , 5.0 ) ;
2941+ let r = 4.0 ;
2942+ assert_eq ! ( capsule_vs_plane( cp1, cp2, r, x, n) , Classification :: Intersects ) ;
2943+
2944+ // intersect cp1 sphere
2945+ /*
2946+ +z
2947+ ^
2948+ |
2949+ --------------------- +x (0, 0, 0)
2950+ cp1 (5, -1)
2951+
2952+ cp2 (0,-5)
2953+ */
2954+
2955+ let cp1 = Vec3f :: new ( 5.0 , 0.0 , -1.0 ) ;
2956+ let cp2 = Vec3f :: new ( 0.0 , 0.0 , -5.0 ) ;
2957+ let r = 10.0 ;
2958+ assert_eq ! ( capsule_vs_plane( cp1, cp2, r, x, n) , Classification :: Intersects ) ;
2959+
2960+ // intersect cp1 sphere
2961+ /*
2962+ +z
2963+ ^
2964+ |
2965+ --------------------- +x (0, 0, 0)
2966+ cp1 (5, -1)
2967+
2968+ cp1 (10,-5)
2969+ */
2970+
2971+ let cp1 = Vec3f :: new ( 5.0 , 0.0 , -1.0 ) ;
2972+ let cp2 = Vec3f :: new ( 10.0 , 0.0 , -5.0 ) ;
2973+ let r = 100.0 ;
2974+ assert_eq ! ( capsule_vs_plane( cp1, cp2, r, x, n) , Classification :: Intersects ) ;
2975+
2976+ // intersect cp2 sphere
2977+ /*
2978+ cp1 (0,5)
2979+
2980+ cp2 (5, 1)
2981+ --------------------- +x (0, 0, 0)
2982+ */
2983+
2984+ let cp2 = Vec3f :: new ( 5.0 , 0.0 , 1.0 ) ;
2985+ let cp1 = Vec3f :: new ( 0.0 , 0.0 , 5.0 ) ;
2986+ let r = 10.0 ;
2987+ assert_eq ! ( capsule_vs_plane( cp1, cp2, r, x, n) , Classification :: Intersects ) ;
2988+
2989+ // intersect cp2 sphere
2990+ /*
2991+ cp1 (10,5)
2992+
2993+ cp2 (5, 1)
2994+ --------------------- +x (0, 0, 0)
2995+ */
2996+
2997+ let cp2 = Vec3f :: new ( 5.0 , 0.0 , 1.0 ) ;
2998+ let cp1 = Vec3f :: new ( 10.0 , 0.0 , 5.0 ) ;
2999+ let r = 100.0 ;
3000+ assert_eq ! ( capsule_vs_plane( cp1, cp2, r, x, n) , Classification :: Intersects ) ;
28923001}
0 commit comments