数学知识

求三个三角形相交 

     inline bool inside(const Vector2 & a, const Vector2 & b)
    {
        return (a.x*b.y - a.y*b.x) >= 0;
    }    
//分割定理求两个2d三角形相交
    bool triangle2DIntersect(Vector2 triA[3], Vector2 triB[3])
    {
        bool signA = inside( triA[1] - triA[0], triA[2] - triA[0] );
        bool signB = inside( triB[1] - triB[0], triB[2] - triB[0] );
        Vector2 segmentA, segmentB;

        for (int i1 = 0, i2 = 2; i1 <= 2; i2 = i1, i1++)
        {
            segmentA = triA[i1] - triA[i2];
            //线段A可以将两个三角形分割开,则不相交
            if (inside( segmentA, triB[0] - triA[i2] ) != signA &&
                inside( segmentA, triB[1] - triA[i2] ) != signA &&
                inside( segmentA, triB[2] - triA[i2] ) != signA) 
            {
                return false;
            }

            segmentB = triB[i1] - triB[i2];
            if (inside( segmentB, triA[0] - triB[i2] ) != signB &&
                inside( segmentB, triA[1] - triB[i2] ) != signB &&
                inside( segmentB, triA[2] - triB[i2] ) != signB)
            {
                return false;
            }
        }
        return true;
    }


输入输出

   std::ostream & operator<<(std::ostream & out, const Vector3 & v)
    {
        out<<"(" <<v.x <<", " <<v.y <<", " <<v.z <<")";
        return out;
    }

    std::istream & operator>>(std::istream & in, Vector3 & v)
    {
        char ch;
        do
        {
            in >> ch;
        }while(ch != '(');

        in>>v.x>>ch >>v.y>>ch >>v.z>>ch;

        return in;
    }


  void Vector3::projectTo2D(Vector2 & p) const
    {
        float maxD = fabs(x);
        p.init(y, z);

        float t = fabs(y);
        if (maxD < t)
        {
            maxD = t;
            p.init(x, z);
        }

        t = fabs(z);
        if (maxD < t)
        {
            p.init(x, y);
        }
    }

    void Vector3::projectTo2D(int & u, int & v) const
    {
        float maxD = fabs(x);
        u = AXIS_Y;
        v = AXIS_Z;

        float t = fabs(y);
        if (maxD < t)
        {
            maxD = t;
            u = AXIS_X;
            v = AXIS_Z;
        }

        t = fabs(z);
        if (maxD < t)
        {
            u = AXIS_X;
            v = AXIS_Y;
        }

    }

	int Vector3::maxAxis() const
	{
		float maxD = fabs(x);
		int axis = AXIS_X;
		
		float t = fabs(y);
		if (maxD < t)
		{
			maxD = t;
			axis = AXIS_Y;
		}

		t = fabs(z);
		if (maxD < t)
		{
			axis = AXIS_Z;
		}

		return axis;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值