Пример #1
0
 public Obb2i(vector center, vector extents, vector ax, vector ay)
 {
     Center  = center;
     Extents = extents;
     Ax      = ax;
     Ay      = ay;
 }
Пример #2
0
 public Obb2i(aabb aabb)
 {
     Center  = aabb.Center;
     Extents = aabb.Extents;
     Ax      = vector.AxisX;
     Ay      = vector.AxisY;
 }
Пример #3
0
 public Obb2i(Obb2d v)
 {
     Center  = new vector(v.Center);
     Extents = new vector(v.Extents);
     Ax      = new vector(v.Ax);
     Ay      = new vector(v.Ay);
 }
Пример #4
0
 public void ElementWiseMaxSelf(vector v)
 {
     if (v.X > X)
     {
         X = v.X;
     }
     if (v.Y > Y)
     {
         Y = v.Y;
     }
 }
Пример #5
0
 public void ElementWiseMinSelf(vector v)
 {
     if (v.X < X)
     {
         X = v.X;
     }
     if (v.Y < Y)
     {
         Y = v.Y;
     }
 }
Пример #6
0
        public bool Intersects(volume obb2)
        {
            volume obb1;

            if (this.IsAabb)
            {
                obb1 = obb2;
                obb2 = this;
            }
            else
            {
                obb1 = this;
            }

            var d = new vector();
            var v = obb1.Center - obb2.Center;

            var eax = obb2.Ax * obb2.Extents.X;
            var eay = obb2.Ay * obb2.Extents.Y;
            var e1  = eax + eay;
            var e2  = eay - eax;

            d.X = Math.Abs(obb1.Ax.Dot(e1));
            d.Y = Math.Abs(obb1.Ax.Dot(e2));
            if (obb1.Extents.X + d.Max() < Math.Abs(obb1.Ax.Dot(v)))
            {
                return(false);
            }
            d.X = Math.Abs(obb1.Ay.Dot(e1));
            d.Y = Math.Abs(obb1.Ay.Dot(e2));
            if (obb1.Extents.Y + d.Max() < Math.Abs(obb1.Ay.Dot(v)))
            {
                return(false);
            }

            eax = obb1.Ax * obb1.Extents.X;
            eay = obb1.Ay * obb1.Extents.Y;
            e1  = eax + eay;
            e2  = eay - eax;
            d.X = Math.Abs(obb2.Ax.Dot(e1));
            d.Y = Math.Abs(obb2.Ax.Dot(e2));
            if (obb2.Extents.X + d.Max() < Math.Abs(obb2.Ax.Dot(v)))
            {
                return(false);
            }
            d.X = Math.Abs(obb2.Ay.Dot(e1));
            d.Y = Math.Abs(obb2.Ay.Dot(e2));
            if (obb2.Extents.Y + d.Max() < Math.Abs(obb2.Ay.Dot(v)))
            {
                return(false);
            }

            return(true);
        }
Пример #7
0
 static public vector ElementWiseMax(vector v1, vector v2)
 {
     if (v2.X < v1.X)
     {
         v2.X = v1.X;
     }
     if (v2.Y < v1.Y)
     {
         v2.Y = v1.Y;
     }
     return(v2);
 }
Пример #8
0
 public Range2i(vector min, vector max, bool normalize)
 {
     if (normalize)
     {
         vector.ElementWiseMinMax(min, max, out Min, out Max);
     }
     else
     {
         Min = min;
         Max = max;
     }
 }
Пример #9
0
        public Range2i(IEnumerable <vector> positions)
        {
            vector min = vector.MaxValue, max = vector.MinValue;

            foreach (var p in positions)
            {
                min.ElementWiseMinSelf(p);
                max.ElementWiseMaxSelf(p);
            }
            Min = min;
            Max = max;
        }
Пример #10
0
        public Range2i(IEnumerable <volume> volumes)
        {
            vector min = vector.MaxValue, max = vector.MinValue;

            foreach (var v in volumes)
            {
                min.ElementWiseMinSelf(v.Min);
                max.ElementWiseMaxSelf(v.Max);
            }
            Min = min;
            Max = max;
        }
Пример #11
0
 public static void ElementWiseMinMax(vector v1, vector v2, out vector min, out vector max)
 {
     if (v2.X < v1.X)
     {
         var t = v1.X; v1.X = v2.X; v2.X = t;
     }
     ;
     if (v2.Y < v1.Y)
     {
         var t = v1.Y; v1.Y = v2.Y; v2.Y = t;
     }
     ;
     min = v1;
     max = v2;
 }
Пример #12
0
 public void ClipSelf(vector min, vector max)
 {
     if (X < min.X)
     {
         X = min.X;
     }
     else if (max.X < X)
     {
         X = max.X;
     }
     if (Y < min.Y)
     {
         Y = min.Y;
     }
     else if (max.Y < Y)
     {
         Y = max.Y;
     }
 }
Пример #13
0
 public bool LessIdThan(vector v)
 {
     if (X < v.X)
     {
         return(true);
     }
     if (X > v.X)
     {
         return(false);
     }
     if (Y < v.Y)
     {
         return(true);
     }
     if (Y > v.Y)
     {
         return(false);
     }
     return(false);
 }
Пример #14
0
        public vector Clip(vector min, vector max)
        {
            vector v = this;

            if (v.X < min.X)
            {
                v.X = min.X;
            }
            else if (max.X < v.X)
            {
                v.X = max.X;
            }
            if (v.Y < min.Y)
            {
                v.Y = min.Y;
            }
            else if (max.Y < v.Y)
            {
                v.Y = max.Y;
            }
            return(v);
        }
Пример #15
0
        /// <summary>
        /// コンストラクタ、管理する範囲と分割数を指定して初期化する
        /// </summary>
        /// <param name="range">管理する範囲</param>
        /// <param name="division">分割数</param>
        public GridSpace2f(range range, vectori division)
        {
            var size = range.Size;

            if (size.HasZero)
            {
                throw new InvalidOperationException("\"range\" must be non zero size.");
            }
            if (division.HasZero)
            {
                throw new InvalidOperationException("\"division\" must be non zero.");
            }

            var divisionf = new vector(division);

            _Range              = range;
            _Division           = division;
            _CellMax            = division - 1;
            _Cells              = new List <T> [division.Y * division.X];
            _CellExtent         = size / (divisionf * 2);
            _TransformScale     = divisionf / size;
            _TransformTranslate = -range.Min;
            _InvTransformScale  = size / divisionf;
        }
Пример #16
0
 public Range2i(Range2d v)
 {
     Min = new vector(v.Min);
     Max = new vector(v.Max);
 }
Пример #17
0
 public bool Contains(vector v)
 {
     v.SubSelf(Center);
     return(Math.Abs(v.X) <= Extents.X && Math.Abs(v.Y) <= Extents.Y);
 }
Пример #18
0
 public void DivSelf(vector v)
 {
     X /= v.X;
     Y /= v.Y;
 }
Пример #19
0
 public void MulSelf(vector v)
 {
     X *= v.X;
     Y *= v.Y;
 }
Пример #20
0
 public Range2i(vector min, vector max)
 {
     Min = min;
     Max = max;
 }
Пример #21
0
 public element Dot(vector v)
 {
     return(X * v.X + Y * v.Y);
 }
Пример #22
0
 public void ExpandSelf(vector v)
 {
     Min.SubSelf(v);
     Max.AddSelf(v);
 }
Пример #23
0
 public Range2i(vector position)
 {
     Min = position;
     Max = position;
 }
Пример #24
0
 public void MergeSelf(vector v)
 {
     Min.ElementWiseMinSelf(v);
     Max.ElementWiseMaxSelf(v);
 }
Пример #25
0
 public volume Expand(vector v)
 {
     return(new volume(Min - v, Max + v));
 }
Пример #26
0
 public volume Merge(vector v)
 {
     return(new volume(vector.ElementWiseMin(Min, v), vector.ElementWiseMax(Max, v)));
 }
Пример #27
0
 public bool Contains(vector v)
 {
     return(Min <= v && v <= Max);
 }
Пример #28
0
 public Aabb2i(Aabb2d v)
 {
     Center  = new vector(v.Center);
     Extents = new vector(v.Extents);
 }
Пример #29
0
 public Aabb2i(vector center, vector extents)
 {
     Center  = center;
     Extents = extents;
 }
Пример #30
0
 public vector Cross(vector v)
 {
     return(new vector(Y * v.X - X * v.Y, X * v.Y - Y * v.X));
 }