Exemplo n.º 1
0
void test8()
{
	SList list1;
	list1.PushBack(1);
	list1.PushBack(2);
	list1.PushBack(3);
	list1.PushBack(4);
	list1.PushBack(5);
	list1.PushBack(6);
	SList list2;
	list2.PushBack(4);
	list2.PushBack(5);
	list2.PushBack(6);
	Node *p = list2.GetTail();
	p->_next = list1.GetHead();
	cout << CheckCross(list1.GetHead(), list2.GetHead()) << endl;
}
// 
// 矩形与三角形是否相交。
//
// 参数1: 三角形点1。
// 
// 参数2: 三角形点2。
//
// 参数3: 三角形点3。
//
// 参数1: 矩形点1。
// 
// 参数2: 矩形点2。
//
// 参数3: 矩形点3。
//
// 参数4: 矩形点4。
//
// 返回值:1 相交, 0 不相交。
// 
bool FairyEditorFrame::Is_Rectangle_Triangle_Intersect(
										  POINT_3D triP1, 
										  POINT_3D triP2,
										  POINT_3D triP3,
										  POINT_3D recP1,
										  POINT_3D recP2,
										  POINT_3D recP3,
										  POINT_3D recP4
										  )
{

	// 先判断三角形是否在矩形内部。

	// 判断点1
	if((triP1.fx >= recP1.fx - OFFEET )&&(triP1.fx <= recP2.fx + OFFEET)&&(triP1.fz >= recP1.fz - OFFEET)&&(triP1.fz <= recP3.fz + OFFEET))
	{
		return true;
	}

	// 判断点2
    if((triP2.fx >= recP1.fx - OFFEET )&&(triP2.fx <= recP2.fx + OFFEET)&&(triP2.fz >= recP1.fz - OFFEET)&&(triP2.fz <= recP3.fz + OFFEET))
	{
		return true;
	}

	// 判断点3
	if((triP3.fx >= recP1.fx - OFFEET )&&(triP3.fx <= recP2.fx + OFFEET)&&(triP3.fz >= recP1.fz - OFFEET)&&(triP3.fz <= recP3.fz + OFFEET))
	{
		return true;
	}

	// 判断四方形的点是否在三角形内

	// 判断点1
	if(IsPointInTriangle(recP1, triP1, triP2, triP3))
	{
		return true;
	}

	// 判断点2
	if(IsPointInTriangle(recP2, triP1, triP2, triP3))
	{
		return true;
	}

	// 判断点3
	if(IsPointInTriangle(recP3, triP1, triP2, triP3))
	{
		return true;
	}

	// 判断点4
	if(IsPointInTriangle(recP4, triP1, triP2, triP3))
	{
		return true;
	}

	// 判断直线是否相交。
	if(CheckCross(recP1, recP2, triP1, triP2))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP1, recP2, triP2, triP3))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP1, recP2, triP3, triP1))
	{
		return true;
	}



	// 判断直线是否相交。
	if(CheckCross(recP2, recP3, triP1, triP2))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP2, recP3, triP2, triP3))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP2, recP3, triP3, triP1))
	{
		return true;
	}


	// 判断直线是否相交。
	if(CheckCross(recP3, recP4, triP1, triP2))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP3, recP4, triP2, triP3))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP3, recP4, triP3, triP1))
	{
		return true;
	}


	// 判断直线是否相交。
	if(CheckCross(recP4, recP1, triP1, triP2))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP4, recP1, triP2, triP3))
	{
		return true;
	}
	// 判断直线是否相交。
	if(CheckCross(recP4, recP1, triP3, triP1))
	{
		return true;
	}


	return false;
}
Exemplo n.º 3
0
bool ZEffectAniMesh::Draw(unsigned long int nTime)
{
    if(m_VMesh.m_pMesh==NULL)
        return false;

    AniFrameInfo* pInfo = m_VMesh.GetFrameInfo(ani_mode_lower);

    if(pInfo->m_pAniSet==NULL)// m_VMesh.m_pAniSet[0]==NULL
        return false;

    if(nTime < m_nStartTime + m_nStartAddTime) {
        return true;
    }
    // 그리기가 연기 된경우 지금 상태의 캐릭터 데이터를 참조..

    if( m_bDelay && !m_isCheck ) {

        ZObject* pObj = ZGetObjectManager()->GetObject(m_uid);

        ZCharacterObject* pCObj = MDynamicCast(ZCharacterObject, pObj);

        if(pCObj) {

            if(!pCObj->IsRendered())
                return false;

            rvector _vp	  = pCObj->GetPosition();
            rvector _vdir = pCObj->m_Direction;
            _vdir.z = 0;
            Normalize(_vdir);

            /*
            int cm = g_pGame->SelectSlashEffectMotion(pObj);//남녀 칼 휘두르는 방향
            if(cm==SEM_ManSlash5) {
            	_vdir.z = 0.f;
            	_vp += _vdir * 120.f;
            	_vp.z -= 100.f;
            }
            else if(cm==SEM_WomanSlash5) {
            	_vdir.z = 0.f;
            	_vp += _vdir * 200.f;
            	_vp.z -= 80.f;
            }
            */

            m_Pos = _vp;
            m_Dir = _vdir;
        }

        m_isCheck = true;
    }

    DWORD dwDiff = nTime - m_nStartTime;

//	float fSec = (float)dwDiff/1000.0f;
//	float fOpacity = (SC_LIFETIME-dwDiff)/(float)SC_LIFETIME;

    rvector Dir;

    rvector Up=m_Up;

    if (m_nAlignType == 0) {
        Dir = -RCameraDirection;
    }
    else if( m_nAlignType == 1 )
    {
        Dir = m_DirOrg;
    }
    else if( m_nAlignType == 2 )
    {
        Dir = rvector( 0,1,0 );
        Up = rvector( 0,0,1 );
    }

    CheckCross(Dir,Up);

    rmatrix World;

    MakeWorldMatrix(&World, m_Pos, Dir, Up);

    rmatrix Rotation;

    D3DXMatrixRotationZ(&Rotation,m_fRotateAngleZ);
    World = Rotation * World;

    D3DXMatrixRotationY(&Rotation,m_fRotateAngleY);
    World = Rotation * World;

    m_VMesh.SetScale(m_Scale);
    m_VMesh.SetWorldMatrix(World);
    m_VMesh.Frame();					// 시간은 흘러 가야 한다~

    if(m_bRender) {
        m_VMesh.Render();
        m_bisRendered = m_VMesh.m_bIsRender;
    }
    else m_bisRendered = false;

    if( m_nAutoAddEffect != ZEffectAutoAddType_None ) {

        rvector vPos;
        RMeshNode* pNode = NULL;

        if(m_nAutoAddEffect == ZEffectAutoAddType_Methor ) {

            pNode = m_VMesh.m_pMesh->GetMeshData("methor");

            vPos.x = pNode->m_mat_result._41;
            vPos.y = pNode->m_mat_result._42;
            vPos.z = pNode->m_mat_result._43;

//			static rmatrix _mrot = RGetRotY(180) * RGetRotX(90);
            static rmatrix _mrot = RGetRotX(90);

            vPos = vPos * _mrot;
            vPos += m_Pos;

            if(m_vBackupPos != vPos) {
                ZGetEffectManager()->AddTrackMethor(vPos);
                m_vBackupPos = vPos;
            }
        }
    }

    if( m_nLifeTime != -1 && m_bLoopType ) {// 소멸 시간이 정해져 있고..에니메이션이 루프 타잎인 경우..
        if(m_VMesh.isOncePlayDone())
            if(nTime > m_nStartTime + m_nLifeTime) {
                return false;
            }
    }
    else {
        if(m_VMesh.isOncePlayDone()) {
            return false;
        }
    }

    return true;
}