Exemple #1
0
		private static Vector2f CreateOrigin(LObject o, Origin origin) {
			Vector2f v = new Vector2f(o.X(), o.Y());
			switch (origin) {
			case Origin.CENTER:
				v.Set(o.GetWidth() / 2f, o.GetHeight() / 2f);
				return v;
			case Origin.TOP_LEFT:
				v.Set(0.0f, o.GetHeight());
				return v;
			case Origin.TOP_RIGHT:
				v.Set(o.GetWidth(), o.GetHeight());
				return v;
			case Origin.BOTTOM_LEFT:
				v.Set(0.0f, 0.0f);
				return v;
			case Origin.BOTTOM_RIGHT:
				v.Set(o.GetWidth(), 0.0f);
				return v;
			case Origin.LEFT_CENTER:
				v.Set(0.0f, o.GetHeight() / 2f);
				return v;
			case Origin.TOP_CENTER:
				v.Set(o.GetWidth() / 2f, o.GetHeight());
				return v;
			case Origin.BOTTOM_CENTER:
				v.Set(o.GetWidth() / 2f, 0.0f);
				return v;
			case Origin.RIGHT_CENTER:
				v.Set(o.GetWidth(), o.GetHeight() / 2f);
				return v;
			default:
				return v;
			}
		}
Exemple #2
0
        public bool Intersect(Line other, bool limit, Vector2f result)
        {
            float dx1   = end.GetX() - start.GetX();
            float dx2   = other.end.GetX() - other.start.GetX();
            float dy1   = end.GetY() - start.GetY();
            float dy2   = other.end.GetY() - other.start.GetY();
            float denom = (dy2 * dx1) - (dx2 * dy1);

            if (denom == 0)
            {
                return(false);
            }

            float ua = (dx2 * (start.GetY() - other.start.GetY()))
                       - (dy2 * (start.GetX() - other.start.GetX()));

            ua /= denom;
            float ub = (dx1 * (start.GetY() - other.start.GetY()))
                       - (dy1 * (start.GetX() - other.start.GetX()));

            ub /= denom;

            if ((limit) && ((ua < 0) || (ua > 1) || (ub < 0) || (ub > 1)))
            {
                return(false);
            }

            float u = ua;

            float ix = start.GetX() + (u * (end.GetX() - start.GetX()));
            float iy = start.GetY() + (u * (end.GetY() - start.GetY()));

            result.Set(ix, iy);
            return(true);
        }
Exemple #3
0
 public SplitEffect(LTexture t, RectBox limit_0, int d)
 {
     this.texture = t;
     this.width = texture.GetWidth();
     this.height = texture.GetHeight();
     this.halfWidth = width / 2;
     this.halfHeight = height / 2;
     this.multiples = 2;
     this.direction = d;
     this.limit = limit_0;
     this.timer = new LTimer(10);
     this.visible = true;
     this.v1 = new Vector2f();
     this.v2 = new Vector2f();
     switch (direction)
     {
         case Config.UP:
         case Config.DOWN:
             special = true;
             {
                 v1.Set(0, 0);
                 v2.Set(halfWidth, 0);
                 break;
             }
         case Config.TLEFT:
         case Config.TRIGHT:
             v1.Set(0, 0);
             v2.Set(halfWidth, 0);
             break;
         case Config.LEFT:
         case Config.RIGHT:
             special = true;
             {
                 v1.Set(0, 0);
                 v2.Set(0, halfHeight);
                 break;
             }
         case Config.TUP:
         case Config.TDOWN:
             v1.Set(0, 0);
             v2.Set(0, halfHeight);
             break;
     }
 }
Exemple #4
0
        public void Set(float sx, float sy, float ex, float ey)
        {
            base.pointsDirty = true;
            start.Set(sx, sy);
            end.Set(ex, ey);
            float dx = (ex - sx);
            float dy = (ey - sy);

            vec.Set(dx, dy);
        }
Exemple #5
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 #6
0
		public void MulEqual(Vector2f v) {
			v.Set(e00 * v.x + e10 * v.y, e01 * v.x + e11 * v.y);
		}
		public virtual int Collide(PShape s1, PShape s2, PContact[] cs) {
			if (s1._type != PShapeType.CIRCLE_SHAPE
					|| s2._type != PShapeType.CONVEX_SHAPE
					&& s2._type != PShapeType.BOX_SHAPE) {
				return 0;
			}
			PCircleShape c1 = (PCircleShape) s1;
			PConvexPolygonShape p1 = (PConvexPolygonShape) s2;
			float distance = -1F;
			int edgeNumber = -1;
			Vector2f[] vers = p1.vers;
			int numVers = p1.numVertices;
			Vector2f normal = new Vector2f();
			Vector2f edgeNormal = new Vector2f();
			Vector2f a = new Vector2f();
			Vector2f b = new Vector2f();
			int num = 0;
			for (int i = 0; i < numVers; i++) {
				a.Set(c1._pos.x - vers[i].x, c1._pos.y - vers[i].y);
				distance = a.Length();
				distance -= c1.rad;
				if (distance <= 0.0F) {
					PContact c = new PContact();
					c.overlap = distance;
					a.Normalize();
					c.normal.Set(a.x, a.y);
					c.pos.Set(vers[i].x, vers[i].y);
					cs[num] = c;
					if (++num == 2) {
						return num;
					}
				}
			}
	
			if (num > 0) {
				return num;
			}
			for (int i_0 = 0; i_0 < numVers; i_0++) {
				Vector2f ver = vers[i_0];
				Vector2f nextVer = vers[(i_0 + 1) % numVers];
				float edgeX = nextVer.x - ver.x;
				float edgeY = nextVer.y - ver.y;
				edgeNormal.Set(edgeY, -edgeX);
				edgeNormal.Normalize();
				a.Set(c1._pos.x - ver.x, c1._pos.y - ver.y);
				b.Set(c1._pos.x - nextVer.x, c1._pos.y - nextVer.y);
				if ((a.x * edgeX + a.y * edgeY) * (b.x * edgeX + b.y * edgeY) <= 0.0F) {
					float edgeLen = (float) System.Math.Sqrt(edgeX * edgeX + edgeY * edgeY);
					float distanceToEdge = System.Math.Abs(a.x * edgeY - a.y * edgeX)
							/ edgeLen;
					if (distanceToEdge <= c1.rad) {
						distanceToEdge -= c1.rad;
						if (distance > distanceToEdge || distance == -1F) {
							edgeNumber = i_0;
							distance = distanceToEdge;
							normal.Set(edgeNormal.x, edgeNormal.y);
						}
					}
				}
			}
	
			if (edgeNumber > -1) {
				PContact c_1 = new PContact();
				c_1.overlap = distance;
				c_1.normal = normal;
				c_1.pos = c1._pos.Sub(normal.Mul(c1.rad));
				cs[0] = c_1;
				return 1;
			}
			bool hit = true;
			for (int i_2 = 0; i_2 < numVers; i_2++) {
				Vector2f ver = vers[i_2];
				Vector2f nextVer = vers[(i_2 + 1) % numVers];
				float v1x = nextVer.x - ver.x;
				float v1y = nextVer.y - ver.y;
				float v2x = c1._pos.x - ver.x;
				float v2y = c1._pos.y - ver.y;
				if (v1x * v2y - v1y * v2x >= 0.0F) {
					continue;
				}
				hit = false;
				break;
			}
	
			if (hit) {
				distance = 1.0F;
				normal = new Vector2f();
				for (int i = 0; i < numVers; i++) {
					Vector2f ver = vers[i];
					Vector2f nextVer = vers[(i + 1) % numVers];
					a.Set(nextVer.x - ver.x, nextVer.y - ver.y);
					a.Normalize();
					float d = c1._pos.Sub(ver).Cross(a);
					if (d < 0.0F && (distance == 1.0F || distance < d)) {
						distance = d;
						normal.Set(a.y, -a.x);
					}
				}
	
				if (distance != 1.0F) {
					PContact c = new PContact();
					c.normal.Set(normal.x, normal.y);
					c.pos.Set(c1._pos.x, c1._pos.y);
					c.overlap = distance;
					cs[0] = c;
					return 1;
				}
			}
			return 0;
		}
Exemple #8
0
 public Vector2f Tmp()
 {
     return(tmp.Set(this));
 }
Exemple #9
0
		public bool Intersect(Line other, bool limit, Vector2f result) {
			float dx1 = end.GetX() - start.GetX();
			float dx2 = other.end.GetX() - other.start.GetX();
			float dy1 = end.GetY() - start.GetY();
			float dy2 = other.end.GetY() - other.start.GetY();
			float denom = (dy2 * dx1) - (dx2 * dy1);
	
			if (denom == 0) {
				return false;
			}
	
			float ua = (dx2 * (start.GetY() - other.start.GetY()))
					- (dy2 * (start.GetX() - other.start.GetX()));
			ua /= denom;
			float ub = (dx1 * (start.GetY() - other.start.GetY()))
					- (dy1 * (start.GetX() - other.start.GetX()));
			ub /= denom;
	
			if ((limit) && ((ua < 0) || (ua > 1) || (ub < 0) || (ub > 1))) {
				return false;
			}
	
			float u = ua;
	
			float ix = start.GetX() + (u * (end.GetX() - start.GetX()));
			float iy = start.GetY() + (u * (end.GetY() - start.GetY()));
	
			result.Set(ix, iy);
			return true;
		}
Exemple #10
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();
		}