home *** CD-ROM | disk | FTP | other *** search
- class smashing.Line
- {
- var vector;
- var p0;
- var bChanged = true;
- function Line(x0, y0, x1, y1)
- {
- var _loc1_ = this;
- _loc1_.p0 = new smashing.Point(x0,y0);
- _loc1_.p1 = new smashing.Point(x1,y1);
- _loc1_.vector = new smashing.Point(_loc1_.p1.x - _loc1_.p0.x,_loc1_.p1.y - _loc1_.p0.y);
- _loc1_.lineNormal = _loc1_.vector.normalize();
- }
- function get normal()
- {
- var _loc1_ = this;
- if(_loc1_.bChanged == true)
- {
- _loc1_.bChanged = false;
- _loc1_.vN = new smashing.Point(_loc1_.vector.y,- _loc1_.vector.x);
- _loc1_.vN.normalizeMe();
- }
- return _loc1_.vN;
- }
- function setLine(x0, y0, x1, y1)
- {
- var _loc1_ = this;
- _loc1_.p0.x = x0;
- _loc1_.p0.y = y0;
- _loc1_.p1.x = x1;
- _loc1_.p1.y = y1;
- _loc1_.vector.x = _loc1_.p1.x - _loc1_.p0.x;
- _loc1_.vector.y = _loc1_.p1.y - _loc1_.p0.y;
- _loc1_.lineNormal = _loc1_.vector.normalize();
- _loc1_.bChanged = true;
- }
- function move(nX, nY)
- {
- var _loc1_ = this;
- _loc1_.p0.x += nX;
- _loc1_.p0.y += nY;
- _loc1_.p1.x += nX;
- _loc1_.p1.y += nY;
- }
- function collisionPointSwept(p, m, radius)
- {
- var _loc1_ = this;
- var _loc2_ = m;
- var nMotionDot = _loc2_.dot(_loc1_.normal);
- if(nMotionDot >= 0)
- {
- return null;
- }
- var pLocalStart = new smashing.Point(p.x - _loc1_.p0.x,p.y - _loc1_.p0.y);
- var pOffset = _loc1_.normal.copy();
- pOffset.multiplyMe(radius);
- var pR = pLocalStart.copy();
- pR.subtractPointMe(pOffset);
- var nOffLine = ((- pR.y) * _loc2_.x + pR.x * _loc2_.y) / (_loc2_.y * _loc1_.vector.x + (- _loc2_.x) * _loc1_.vector.y);
- var lReturn;
- if(nOffLine >= 0 && nOffLine <= 1)
- {
- var _loc3_ = new smashing.Point(_loc1_.vector.x * nOffLine,_loc1_.vector.y * nOffLine);
- var dX = _loc3_.x - pR.x;
- var dY = _loc3_.y - pR.y;
- var mX = _loc2_.x;
- var mY = _loc2_.y;
- var pD = new smashing.Point(_loc3_.x - pR.x,_loc3_.y - pR.y);
- if(dX * mX + dY * mY < 0)
- {
- return null;
- }
- dX *= dX;
- dY *= dY;
- mX *= mX;
- mY *= mY;
- var nD = dX + dY;
- if(nD > mX + mY)
- {
- return null;
- }
- _loc3_.x += _loc1_.p0.x + pOffset.x;
- _loc3_.y += _loc1_.p0.y + pOffset.y;
- lReturn = new smashing.CollisionResult(_loc3_,_loc1_.normal,nD);
- lReturn.gizmo = _loc1_;
- lReturn.lHit = _loc3_;
- }
- else
- {
- var unitMotion = _loc2_.normalize();
- if(nOffLine < 0)
- {
- var pEndPoint = _loc1_.p0;
- var pToEnd = pLocalStart.reverse();
- }
- else if(nOffLine > 0)
- {
- var pEndPoint = _loc1_.p1;
- var pToEnd = new smashing.Point(_loc1_.p1.x - p.x,_loc1_.p1.y - p.y);
- }
- var nClosest = pToEnd.dot(unitMotion);
- if(_loc2_.length < Math.abs(nClosest) - radius)
- {
- return null;
- }
- var nHyp = pToEnd.length;
- var nOppSqu = nHyp * nHyp - nClosest * nClosest;
- var nRadiusSqu = radius * radius;
- if(nOppSqu > nRadiusSqu)
- {
- return null;
- }
- var nFinal = Math.sqrt(nRadiusSqu - nOppSqu) - nClosest;
- if(Math.abs(nFinal) > _loc2_.length)
- {
- return null;
- }
- var vFinal = unitMotion.multiply(nFinal);
- if(vFinal.dot(_loc2_) > 0)
- {
- return null;
- }
- var vClipped = new smashing.Point(p.x - vFinal.x,p.y - vFinal.y);
- var vCNormal = new smashing.Point(vClipped.x - pEndPoint.x,vClipped.y - pEndPoint.y).normalize();
- lReturn = new smashing.CollisionResult(vClipped,vCNormal,nFinal * nFinal);
- lReturn.gizmo = _loc1_;
- lReturn.lHit = vFinal;
- }
- return lReturn;
- }
- function collisionPoint(p, m, r)
- {
- var _loc1_ = this;
- var nMD = m.dot(_loc1_.normal);
- if(nMD > 0)
- {
- return null;
- }
- var _loc3_ = new smashing.Point(p.x + m.x,p.y + m.y);
- var de = _loc1_.vector.x * (_loc3_.x - _loc1_.p0.x) + _loc1_.vector.y * (_loc3_.y - _loc1_.p0.y);
- var e2 = _loc1_.vector.dot(_loc1_.vector);
- var _loc2_ = undefined;
- var nDist;
- var lR;
- if(de < 0)
- {
- _loc2_ = new smashing.Point(_loc3_.x - _loc1_.p0.x,_loc3_.y - _loc1_.p0.y);
- nDist = _loc2_.dot(_loc2_);
- if(nDist > r * r)
- {
- return null;
- }
- var cN = _loc2_.normalize();
- _loc2_.length = r;
- var pC2 = _loc1_.p0.addPoint(_loc2_);
- var xF = pC2.x - p.x;
- var yF = pC2.y - p.y;
- var lR = new smashing.CollisionResult(pC2,cN,xF * xF + yF * yF);
- lR.lHit = _loc1_.p0;
- lR.nRatio = 0;
- lR.gizmo = _loc1_;
- }
- else if(de > e2)
- {
- _loc2_ = new smashing.Point(_loc3_.x - _loc1_.p1.x,_loc3_.y - _loc1_.p1.y);
- nDist = _loc2_.dot(_loc2_);
- if(nDist > r * r)
- {
- return null;
- }
- var cN = _loc2_.normalize();
- _loc2_.length = r;
- var pC2 = _loc1_.p1.addPoint(_loc2_);
- var xF = pC2.x - p.x;
- var yF = pC2.y - p.y;
- var lR = new smashing.CollisionResult(pC2,cN,xF * xF + yF * yF);
- lR.lHit = _loc1_.p1;
- lR.nRatio = 1;
- lR.gizmo = _loc1_;
- }
- else
- {
- var t = de / e2;
- var pC = new smashing.Point(_loc1_.p0.x + _loc1_.vector.x * t,_loc1_.p0.y + _loc1_.vector.y * t);
- var xDist = _loc3_.x - pC.x;
- var yDist = _loc3_.y - pC.y;
- if(xDist * xDist + yDist * yDist > r * r)
- {
- return null;
- }
- var pC2 = new smashing.Point(pC.x + _loc1_.normal.x * r,pC.y + _loc1_.normal.y * r);
- var xF = pC2.x - p.x;
- var yF = pC2.y - p.y;
- var lR = new smashing.Line(pC2.x + cN.x,pC2.y + cN.y,pC2.x,pC2.y);
- var dist2 = xF * xF + yF * yF;
- lR = new smashing.CollisionResult(pC2,_loc1_.normal,dist2);
- lR.lHit = pC;
- lR.nRatio = t;
- lR.gizmo = _loc1_;
- }
- return lR;
- }
- function nearestPointSeg(m0)
- {
- var _loc1_ = this;
- var D = new smashing.Point(m0.x - _loc1_.p0.x,m0.y - _loc1_.p0.y);
- var _loc2_ = _loc1_.vector.dot(D);
- var e2 = _loc1_.vector.dot(_loc1_.vector);
- if(_loc2_ < 0)
- {
- return _loc1_.p0;
- }
- if(_loc2_ > e2)
- {
- return _loc1_.p1;
- }
- var _loc3_ = _loc2_ / e2;
- return new smashing.Point(_loc1_.p0.x + _loc1_.vector.x * _loc3_,_loc1_.p0.y + _loc1_.vector.y * _loc3_);
- }
- function nearestPointLine(m0)
- {
- var _loc1_ = this;
- var _loc3_ = new smashing.Point(m0.x - _loc1_.p0.x,m0.y - _loc1_.p0.y);
- var de = _loc1_.vector.dot(_loc3_);
- var e2 = _loc1_.vector.dot(_loc1_.vector);
- var _loc2_ = de / e2;
- return new smashing.Point(_loc1_.p0.x + _loc1_.vector.x * _loc2_,_loc1_.p0.y + _loc1_.vector.y * _loc2_);
- }
- function nearestPointRatio(p)
- {
- var _loc1_ = this;
- var _loc2_ = new smashing.Point(p.x - _loc1_.p0.x,p.y - _loc1_.p0.y);
- var de = _loc1_.vector.dot(_loc2_);
- var e2 = _loc1_.vector.dot(_loc1_.vector);
- var _loc3_ = de / e2;
- return _loc3_;
- }
- function distanceFrom(p)
- {
- var _loc3_ = this;
- var _loc1_ = new smashing.Point(p.x - _loc3_.p0.x,p.y - _loc3_.p0.y);
- var _loc2_ = _loc3_.normal.dot(_loc1_);
- return _loc2_;
- }
- function intersection(op0, op1, oVector)
- {
- var _loc1_ = op0;
- var a1;
- var b1;
- var c1;
- var a2;
- var b2;
- var c2;
- var det_inv;
- var _loc3_ = undefined;
- var _loc2_ = undefined;
- var xi;
- var yi;
- if(this.vector.x != 0)
- {
- _loc3_ = this.vector.y / this.vector.x;
- }
- else
- {
- _loc3_ = Infinity;
- }
- if(op1.x - _loc1_.x != 0)
- {
- _loc2_ = (op1.y - _loc1_.y) / (op1.x - _loc1_.x);
- }
- else
- {
- _loc2_ = Infinity;
- }
- a1 = _loc3_;
- a2 = _loc2_;
- b1 = -1;
- b2 = -1;
- c1 = this.p0.y - _loc3_ * this.p0.x;
- c2 = _loc1_.y - _loc2_ * _loc1_.x;
- det_inv = 1 / (a1 * b2 - a2 * b1);
- xi = (b1 * c2 - b2 * c1) * det_inv;
- yi = (a2 * c1 - a1 * c2) * det_inv;
- return new smashing.Point(xi,yi);
- }
- function toString()
- {
- var _loc1_ = this;
- return "Line(" + _loc1_.p0.x + ", " + _loc1_.p0.y + ", " + _loc1_.p1.x + ", " + _loc1_.p1.y + ")";
- }
- }
-