| TWiki . Team4 . CodeTemp |
= 0) && (qPrime.x_ < 0) ) // if edge on the z-axis
return cIntersectionResult(false, 1);
if( qPrime.x_ <= (standard.v1_.x_ * (qPrime.z_ / standard.v1_.z_)) )
return cIntersectionResult(false, 1);
// check edge v1-v2
if( qPrime.x_ >= standard.v2_.x_ + (standard.v1_.x_ - standard.v2_.x_) * (qPrime.z_ - standard.v2_.z_) / (standard.v1_.z_ - standard.v2_.z_))
return cIntersectionResult(false, 1);
return cIntersectionResult(true, beta);
}
cIntersectionResult cBall::intersectsEdge(cVector &start, cVector &end, cEdge &edge)
{
// get the standardized edge and
// transform the start and end vectors into standardized space
float* transform = edge.getStandardEdgeTransform();
cVector standardStart = start.matrixMultiply(transform);
cVector standardEnd = end.matrixMultiply(transform);
// checking if velocity is parallel to the edge
if( standardStart.y_ = 0 && standardEnd.z_ = 0)
return cIntersectionResult(false,1);
float A = (standardEnd.y_- standardStart.y_)*(standardEnd.y_- standardStart.y_) + (standardEnd.z_-standardStart.z_)*(standardEnd.z_-standardStart.z_);
float B = 2 * ((standardStart.y_ * (standardEnd.y_- standardStart.y_)) + (start.z_ * (standardEnd.z_- standardStart.z_))) ;
float C = (standardStart.y_*standardStart.y_) + (standardStart.z_*standardStart.z_) - (radius_*radius_);
cIntersectionResult result = quadratic(A,B,C);
//checking to see if beta is actually on the edge not just x-axis
if( !result.intersected_)
return result;
if(standardStart.x_ + result.beta_* (standardEnd.x_ - standardStart.x_) < edge.standardizedX_ &&
standardStart.x_ + result.beta_* (standardEnd.x_ - standardStart.x_) > 0)
return result;
return cIntersectionResult(false, 1);
}
cIntersectionResult cBall::intersectsVertex(cVector &start, cVector &end, cVertex &vertex)
{
// the ball is moving toward the vertex, solve this quadratic
float A = (end.x_-start.x_)*(end.x_-start.x_) + (end.y_-start.y_)*(end.y_-start.y_) +
(end.z_-start.z_)*(end.z_-start.z_);
float B = 2*( (end.x_-start.x_)*(start.x_-vertex.x_) + (end.y_-start.y_)*(start.y_-vertex.y_) +
(end.z_-start.z_)*(start.z_-vertex.z_));
float C = (start.x_-vertex.x_)*(start.x_-vertex.x_)+(start.y_-vertex.y_)*(start.y_-vertex.y_)
+(start.z_-vertex.z_)*(start.z_-vertex.z_)- (radius_*radius_);
return quadratic(A,B,C);
}
cIntersectionResult cBall::quadratic(float A, float B, float C)
{
float discr = (B*B) - (4*A*C);
if( discr <= 0.0000001) return cIntersectionResult(false, 1);
discr = sqrt(discr);
float beta1 = (-1*B + discr)/ (2 * A);
float beta2 = (-1*B - discr)/(2 * A);
float minBeta = 1;
bool inRange = false;
if(beta2 > 0 && beta2 <= 1) { minBeta = beta2; inRange = true; }
if(beta1 > 0 && beta2 <= 1)
{
inRange = true;
if(beta1 < minBeta) minBeta = beta1;
}
if(inRange)
return cIntersectionResult(true, minBeta);
else return cIntersectionResult(false, 1);
}
----- Revision r1.1 - 09 Mar 2004 - 08:59 GMT - AndrewKim
|