예제 #1
0
파일: Rotor.cs 프로젝트: Ziriax/KleinSharp
        public bool Equals(Rotor other, float epsilon)
        {
            __m128 eps = _mm_set1_ps(epsilon);
            __m128 cmp = _mm_cmplt_ps(
                _mm_andnot_ps(_mm_set1_ps(-0f), _mm_sub_ps(P1, other.P1)), eps);

            return(_mm_movemask_ps(cmp) != 0b1111);
        }
예제 #2
0
파일: Math.cs 프로젝트: Ziriax/KleinSharp
        public static Branch Log(Rotor r)
        {
            float cos_ang = _mm_store_ss(r.P1);
            float ang     = MathF.Acos(cos_ang);
            float sin_ang = MathF.Sin(ang);

            var p1 = _mm_mul_ps(r.P1, Detail.rcp_nr1(_mm_set1_ps(sin_ang)));

            p1 = _mm_mul_ps(p1, _mm_set1_ps(ang));
            p1 = Sse41.IsSupported
                                ? _mm_blend_ps(p1, _mm_setzero_ps(), 1)
                                : _mm_and_ps(p1, _mm_castsi128_ps(_mm_set_epi32(-1, -1, -1, 0)));

            return(new Branch(p1));
        }
예제 #3
0
파일: Math.cs 프로젝트: Ziriax/KleinSharp
        public static Rotor Sqrt(Branch b)
        {
            var p1 = _mm_add_ss(b.P1, _mm_set_ss(1f));

            return(new Rotor(Rotor.Normalized(p1)));
        }
예제 #4
0
파일: Rotor.cs 프로젝트: Ziriax/KleinSharp
 public bool Equals(Rotor other)
 {
     return(P1.Equals(other.P1));
 }