Ejemplo n.º 1
0
bool CHitSquare::CheckHitLineSegmentLineSegment(Segment * seg1,Segment * seg2,D3DXVECTOR2* outPos)
{
	D3DXVECTOR2 v = seg2->s - seg1->s;
	float Crs_v1_v2 = D3DXVec2Cross( &seg1->v, &seg2->v );
	if ( Crs_v1_v2 == 0.0f ) {
	  // 平行状態
	  return false;
	}

	float Crs_v_v1 = D3DXVec2Cross( &v, &seg1->v );
	float Crs_v_v2 = D3DXVec2Cross( &v, &seg2->v );

	float t1 = Crs_v_v2 / Crs_v1_v2;
	float t2 = Crs_v_v1 / Crs_v1_v2;

	const float eps = 0.00001f;
	if ( t1 + eps < 0 || t1 - eps > 1 || t2 + eps < 0 || t2 - eps > 1 ) {
	  // 交差していない
	  return false;
	}

	if( outPos )
	  *outPos = seg1->s + seg1->v * t1;

	return true;	
}
Ejemplo n.º 2
0
//直線交差判定
//線分1、線分2、交点
bool IsHitByLine(SEGMENT segment1, SEGMENT segment2, D3DXVECTOR2* point)
{
	bool isHit = false;
	D3DXVECTOR2 vec = segment2.vec2StartPoint - segment1.vec2StartPoint;
	float CrossV1_V2 = D3DXVec2Cross(segment1.vec2Direct, segment2.vec2Direct);
	
	//平行
	if(CrossV1_V2 == 0.0f)
	{
		return false;
	}

	float CrossV_V1 = D3DXVec2Cross(vec, segment1.vec2Direct);
	float CrossV_V2 = D3DXVec2Cross(vec, segment2.vec2Direct);

	float t1 = CrossV_V2 / CrossV1_V2;
	float t2 = CrossV_V1 / CrossV1_V2;

	const float eps = 0.00001f;
	if((t1+ eps < 0.0f || t1- eps >1.0f) || (t2 + eps < 0.0f || t2 - eps>1.0f))
	{
		return false;
	}
	isHit = true;

	*point = segment1.vec2StartPoint + segment1.vec2Direct * t1;

	return isHit;
}
Ejemplo n.º 3
0
bool CHitSquare::CheckHitCircleLineSegment(Circle * pcircle,Segment * seg)
{
	Segment segbuf,segbuf2;
	segbuf.s = seg->s;
	segbuf.v = pcircle->center - seg->s;

	segbuf2.s = seg->s + seg->v;
	segbuf2.v = segbuf.v - seg->v;

	float lenge = D3DXVec2Cross(&seg->v,&segbuf.v)/D3DXVec2Length(&seg->v);
	if(D3DXVec2Length(&seg->v) == 0)
		lenge = D3DXVec2Length(&(segbuf.v));

	if(lenge < 0)
		lenge = -lenge;
	
	if(pcircle->halfdiameter < lenge)
		return false;

	if(D3DXVec2Dot(&segbuf.v,&seg->v)*D3DXVec2Dot(&segbuf2.v,&seg->v) <= 0)
		return true;
	else
	if(pcircle->halfdiameter > D3DXVec2Length(&segbuf.v )||pcircle->halfdiameter > D3DXVec2Length(&segbuf2.v ))
		return true;

	return false;
}