Exemple #1
0
        public bool Intersects(Line other)
        {
            Vector2f lineSegmentStart = new Vector2f(other.GetX1(), other.GetY1());
            Vector2f lineSegmentEnd   = new Vector2f(other.GetX2(), other.GetY2());
            Vector2f circleCenter     = new Vector2f(GetCenterX(), GetCenterY());
            Vector2f closest;
            Vector2f segv       = lineSegmentEnd.Sub(lineSegmentStart);
            Vector2f ptv        = circleCenter.Sub(lineSegmentStart);
            float    segvLength = segv.Len();
            float    projvl     = ptv.Dot(segv) / segvLength;

            if (projvl < 0)
            {
                closest = lineSegmentStart;
            }
            else if (projvl > segvLength)
            {
                closest = lineSegmentEnd;
            }
            else
            {
                Vector2f projv = segv.Mul(projvl / segvLength);
                closest = lineSegmentStart.Add(projv);
            }
            bool intersects = circleCenter.Sub(closest).LengthSquared() <= GetRadius()
                              * GetRadius();

            return(intersects);
        }
Exemple #2
0
        public float DistanceSquared(Vector2f point)
        {
            GetClosestPoint(point, closest);
            closest.Sub(point);

            float result = closest.LengthSquared();

            return(result);
        }
Exemple #3
0
		public PRodJoint(PBody b1_0, PBody b2_1, float rel1x, float rel1y, float rel2x,
				float rel2y, float distance) {
			this.b1 = b1_0;
			this.b2 = b2_1;
			localAnchor1 = new Vector2f(rel1x, rel1y);
			localAnchor2 = new Vector2f(rel2x, rel2y);
			b1_0.mAng.Transpose().MulEqual(localAnchor1);
			b2_1.mAng.Transpose().MulEqual(localAnchor2);
			dist = distance;
			anchor1 = b1_0.mAng.Mul(localAnchor1).Add(b1_0.pos);
			anchor2 = b2_1.mAng.Mul(localAnchor2).Add(b2_1.pos);
			normal = anchor1.Sub(anchor2);
			normal.Normalize();
			type = Physics.PJointType.ROD_JOINT;
		}
Exemple #4
0
		public void Set(Vector2f start_0, Vector2f end_1) {
			base.pointsDirty = true;
			if (this.start == null) {
				this.start = new Vector2f();
			}
			this.start.Set(start_0);
	
			if (this.end == null) {
				this.end = new Vector2f();
			}
			this.end.Set(end_1);
	
			vec = new Vector2f(end_1);
			vec.Sub(start_0);
	
		}
Exemple #5
0
		public PSpringJoint(PBody b1_0, PBody i_2, float rel1x, float rel1y,
				float rel2x, float rel2y, float distance, float strength,
				float damping) {
			this.b1 = b1_0;
			this.b2 = i_2;
			str = strength;
			damp = damping;
			localAnchor1 = new Vector2f(rel1x, rel1y);
			localAnchor2 = new Vector2f(rel2x, rel2y);
			b1_0.mAng.Transpose().MulEqual(localAnchor1);
			i_2.mAng.Transpose().MulEqual(localAnchor2);
			dist = distance;
			anchor1 = b1_0.mAng.Mul(localAnchor1).Add(b1_0.pos);
			anchor2 = i_2.mAng.Mul(localAnchor2).Add(i_2.pos);
			normal = anchor1.Sub(anchor2);
			normal.Normalize();
			type = Physics.PJointType.SPRING_JOINT;
		}
Exemple #6
0
        public void Set(Vector2f start_0, Vector2f end_1)
        {
            base.pointsDirty = true;
            if (this.start == null)
            {
                this.start = new Vector2f();
            }
            this.start.Set(start_0);

            if (this.end == null)
            {
                this.end = new Vector2f();
            }
            this.end.Set(end_1);

            vec = new Vector2f(end_1);
            vec.Sub(start_0);
        }
Exemple #7
0
        public void GetClosestPoint(Vector2f point, Vector2f result)
        {
            loc.Set(point);
            loc.Sub(start);

            float projDistance = vec.Dot(loc);

            projDistance /= vec.LengthSquared();

            if (projDistance < 0)
            {
                result.Set(start);
                return;
            }
            if (projDistance > 1)
            {
                result.Set(end);
                return;
            }

            result.x = start.GetX() + projDistance * vec.GetX();
            result.y = start.GetY() + projDistance * vec.GetY();
        }
Exemple #8
0
		public bool Intersects(Line other) {
			Vector2f lineSegmentStart = new Vector2f(other.GetX1(), other.GetY1());
			Vector2f lineSegmentEnd = new Vector2f(other.GetX2(), other.GetY2());
			Vector2f circleCenter = new Vector2f(GetCenterX(), GetCenterY());
			Vector2f closest;
			Vector2f segv = lineSegmentEnd.Sub(lineSegmentStart);
			Vector2f ptv = circleCenter.Sub(lineSegmentStart);
			float segvLength = segv.Len();
			float projvl = ptv.Dot(segv) / segvLength;
			if (projvl < 0) {
				closest = lineSegmentStart;
			} else if (projvl > segvLength) {
				closest = lineSegmentEnd;
			} else {
				Vector2f projv = segv.Mul(projvl / segvLength);
				closest = lineSegmentStart.Add(projv);
			}
			bool intersects = circleCenter.Sub(closest).LengthSquared() <= GetRadius()
					* GetRadius();
			return intersects;
		}