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; }
//直線交差判定 //線分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; }
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; }