亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? verlet.cpp.svn-base

?? 坦克大戰游戲完整全套源代碼
?? SVN-BASE
字號:
#include "verlet/verlet.h"


namespace verlet
{
    size_t iBody::Collide(iBody& body, float dt, Contact *pxContacts, size_t numMaxContacts)
    {
        if (!shape || !body.shape || this->isStaticBody() && body.isStaticBody())
            return 0;
        assert(shape && body.shape);
        return shape->collide(*body.shape, dt, pxContacts, numMaxContacts);
    }
    void Body::Reset(const Point2f& xPosition, float fOrientation, float fMass)
    {
        this->pos           = xPosition;
        this->orientation   = fOrientation;
        this->mass          = fMass;
        this->invMass       = (fMass == 0.0f) ? 0.0f : 1.0f / fMass;
        this->inertia       = (fMass == 0.0f || !shape) ? 0.0f : mass * shape->GetInertiaMoment();
        this->invInertia    = (mass == 0.0f) ? 0.0f : 1.0f / inertia;
        this->velocity      = Point2f(0.0f, 0.0f);
        this->angVelocity   = 0.0f;
        this->netForce      = Point2f(0.0f, 0.0f);
        this->netTorque     = 0.0f;
        if (this->shape)
            this->shape->update();
    }
    void Body::Update(float dt)
    {
        //-------------------------------------------------------
        // Integrate position (verlet integration)
        //-------------------------------------------------------
        Point2f xAccel  = netForce * invMass;
        pos += velocity * dt;// + 0.5f * xAccel * dt*dt;
        orientation += angVelocity * dt;

        assert(xAccel.Length() < 1e3);
        //-------------------------------------------------------
        // Integrate velocity (implicit linear velocity)
        //-------------------------------------------------------
        velocity += xAccel * dt;
        angVelocity += netTorque * (invInertia * dt);

        //-------------------------------------------------------
        // clear forces
        //-------------------------------------------------------
        netForce = Point2f(0.0f, 0.0f);
        netTorque = 0.0f;

        if (shape)
            shape->update();
    }
    void StaticBody::Reset(const Point2f& xPosition, float fOrientation)
    {
        iBody::Reset(xPosition, fOrientation, 0.f);

        if (shape)
            shape->update();
    }
    bool ProjectPointOnSegment(const Point2f& P, const Point2f& E0, const Point2f& E1, Point2f& Q)
    {
        Point2f E = E1 - E0;
        Point2f D = P  - E0;
        float e2 = E * E;
        float de = D * E;

        if (de < 0.0f || de > e2)
            return false;

        Q = E0 + E * (de / e2);

        return true;
    }

    bool ConvertSupportPointsToContacts(const BoxShape& box1, const BoxShape& box2, 
        const Point2f& xAxis,
        Point2f* pxPoints0, size_t numP0, 
        Point2f* pxPoints1, size_t numP1,
        Contact* xContacts, size_t& iNumContacts)
    {
        iNumContacts = 0;

        Point2f xPerp(-xAxis.y, xAxis.x);

        float min0 = pxPoints0[0] * xPerp;
        float max0 = min0;
        float min1 =  pxPoints1[0] * xPerp;
        float max1 = min1;

        if (numP0 == 2)
        {
            max0 = pxPoints0[1] * xPerp;

            if (max0 < min0) 
            { 
                float c = min0;
                min0 = max0;
                max0 = c;

                Point2f T = pxPoints0[0];
                pxPoints0[0] = pxPoints0[1];
                pxPoints0[1] = T;
            }
        }

        if (numP1 == 2)
        {
            max1 = pxPoints1[1] * xPerp;

            if (max1 < min1) 
            { 
                float c = min1;
                min1 = max1;
                max1 = c;

                Point2f T = pxPoints1[0];
                pxPoints1[0] = pxPoints1[1];
                pxPoints1[1] = T;
            }
        }

        if (min0 > max1 || min1 > max0)
            return false;

        if (min0 > min1)
        {
            Point2f Pseg;
            if (ProjectPointOnSegment(pxPoints0[0], pxPoints1[0], pxPoints1[1], Pseg))
            {
                xContacts[iNumContacts++] = Contact(pxPoints0[0], Pseg, &box1.body, &box2.body);
            }
        }
        else
        {
            Point2f Pseg;
            if (ProjectPointOnSegment(pxPoints1[0], pxPoints0[0], pxPoints0[1], Pseg))
            {
                xContacts[iNumContacts++] = Contact(Pseg, pxPoints1[0], &box1.body, &box2.body);
            }
        }

        if (max0 != min0 && max1 != min1)
        {
            if (max0 < max1)
            {
                Point2f Pseg;
                if (ProjectPointOnSegment(pxPoints0[1], pxPoints1[0], pxPoints1[1], Pseg))
                {
                    xContacts[iNumContacts++] = Contact(pxPoints0[1], Pseg, &box1.body, &box2.body);
                }
            }
            else
            {
                Point2f Pseg;
                if (ProjectPointOnSegment(pxPoints1[1], pxPoints0[0], pxPoints0[1], Pseg))
                {
                    xContacts[iNumContacts++] = Contact(Pseg, pxPoints1[1], &box1.body, &box2.body);
                }
            }
        }
        return true;
    }

    bool FindCollisionPlane(const Point2f* xAxes, float* d, Point2f& Ncoll, float& dcoll)
    {
        float dmin = 1000000.0f;
        int imin = -1;

        for(int i = 0; i < 4; i ++)
        {
            float a = xAxes[i].Length();

            if (a < 0.000001f)
                continue;

            float depth = d[i] / a;

            if (depth < dmin)
            {
                dmin = depth;
                imin = i;
                Ncoll = xAxes[i] / a;
                dcoll = depth;
            }
        }

        return (imin != -1);
    }
    bool IntervalIntersect(const Point2f& xAxis, const BoxShape& box1, const BoxShape& box2, float& depth)
    {
        float min0, max0;
        float min1, max1;

        box1.GetInterval(xAxis, min0, max0);
        box2.GetInterval(xAxis, min1, max1);

        if (min0 > max1 || min1 > max0) return false;

        float d0 = max1 - min0;
        float d1 = max0 - min1;

        if (d0 < d1)
            depth = d0;
        else
            depth = d1;

        return true;
    }

    size_t collide(BoxShape &box1, BoxShape &box2, float dt, Contact *pxContacts, size_t numMaxContacts)
    {
        dt;

        Point2f xAxis [4];
        float  fDepth[4];

        xAxis[0] = box1.GetDir(0);
        if (!IntervalIntersect(xAxis[0], box1, box2, fDepth[0])) return 0;

        xAxis[1] = box1.GetDir(1);
        if (!IntervalIntersect(xAxis[1], box1, box2, fDepth[1])) return 0;

        xAxis[2] = box2.GetDir(0);
        if (!IntervalIntersect(xAxis[2], box1, box2, fDepth[2])) return 0;

        xAxis[3] = box2.GetDir(1);
        if (!IntervalIntersect(xAxis[3], box1, box2, fDepth[3])) return 0;

        float dcoll;
        Point2f Ncoll;
        if (!FindCollisionPlane(xAxis, fDepth, Ncoll, dcoll)) return 0;

        Point2f D = box1.body.getPosition() - box2.body.getPosition();

        if (D * Ncoll < 0.0f)
            Ncoll *= -1.0f;

        Point2f xPoints0[4];
        Point2f xPoints1[4];
        size_t numPoints0;
        size_t numPoints1;

        numPoints0 = box1.FindSupportPoints( Ncoll, xPoints0);
        numPoints1 = box2.FindSupportPoints(-Ncoll, xPoints1);

        if (!ConvertSupportPointsToContacts(box1, box2, Ncoll, xPoints0, numPoints0, xPoints1, numPoints1, pxContacts, numMaxContacts))
            return 0;
        return numMaxContacts;
    }
    size_t collide(CircleShape &circle, BoxShape &box, float dt, Contact *pxContacts, size_t numMaxContacts)
    {
        dt, pxContacts, numMaxContacts;
        const Point2f &p1 = circle.body.getPosition();
        const Point2f &p2 = box.body.getPosition();

        // work in the box's coordinate system
        const Point2f kDiff = p1 - p2;

        // compute squared distance and closest point on box
        float fSqrDistance = 0.0f, fDelta;
        Point2f kClosest(kDiff * box.GetDir(0), kDiff * box.GetDir(1));
        const Point2f &extents = box.GetExtents();
        if (kClosest.x < -extents.x)
        {
            fDelta = kClosest.x + extents.x;
            fSqrDistance += fDelta*fDelta;
            kClosest.x = -extents.x;
        }
        else if (kClosest.x > extents.x)
        {
            fDelta = kClosest.x - extents.x;
            fSqrDistance += fDelta*fDelta;
            kClosest.x = extents.x;
        }
        if (kClosest.y < -extents.y)
        {
            fDelta = kClosest.y + extents.y;
            fSqrDistance += fDelta*fDelta;
            kClosest.y = -extents.y;
        }
        else if (kClosest.y > extents.y)
        {
            fDelta = kClosest.y - extents.y;
            fSqrDistance += fDelta*fDelta;
            kClosest.y = extents.y;
        }
        if (fSqrDistance > circle.GetRadius() * circle.GetRadius())
        {
            return 0;
        }
        Point2f d = p2 + kClosest - p1;
        d.Normalize();

        pxContacts[0] = Contact(p1 + d * circle.GetRadius(), p2 + kClosest, &circle.body, &box.body);
        return 1;
    }
    size_t collide(CircleShape &circle1, CircleShape &circle2, float dt, Contact *pxContacts, size_t numMaxContacts)
    {
        dt, numMaxContacts;

        float rR = circle1.GetRadius() + circle2.GetRadius();
        const Point2f &p1 = circle1.body.getPosition();
        const Point2f &p2 = circle2.body.getPosition();
        Point2f d = p2 - p1;
        float len = d.Length();
        if (len > rR)
        {
            return 0;
        }
        d.Normalize();
        
        pxContacts[0] = Contact(p1 + d * circle1.GetRadius(), p1 + d * (len - circle1.GetRadius()), &circle1.body, &circle2.body);
        return 1;
    }

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内成人自拍视频| 国产精品污www在线观看| 国产精品色婷婷久久58| 亚洲图片一区二区| 成人免费毛片嘿嘿连载视频| 欧美日韩电影一区| 一区二区三区免费观看| 国产99精品视频| 久久久99精品免费观看| 美女免费视频一区二区| 欧美日韩免费电影| 一区二区三区美女| 色吧成人激情小说| 免费一级欧美片在线观看| 色哟哟在线观看一区二区三区| 国产日韩欧美精品综合| 国产不卡在线播放| 国产日韩视频一区二区三区| 老司机精品视频线观看86| 91精品国产色综合久久| 亚洲3atv精品一区二区三区| 欧美在线观看你懂的| 亚洲国产日产av| 欧美一级一区二区| 免费精品99久久国产综合精品| 日韩一区二区电影| 国产在线精品一区二区三区不卡| 日韩美女在线视频| 国产伦精品一区二区三区免费迷| 久久久99久久| 色诱视频网站一区| 亚洲一二三四久久| 亚洲免费av高清| 欧美亚男人的天堂| 久久9热精品视频| 久久精品一区二区三区不卡| av一区二区不卡| 欧美一区二区三区四区五区| 日韩高清在线电影| 国产日产欧美精品一区二区三区| www.成人在线| 日韩avvvv在线播放| 久久久.com| 欧美日韩精品一区二区三区四区| 免费成人性网站| 日韩一区在线看| 欧美一区二区三区视频在线观看| thepron国产精品| 欧美一二三区在线观看| 精品捆绑美女sm三区| 久久丁香综合五月国产三级网站 | 国产日韩v精品一区二区| 在线观看日韩一区| 国产成人精品免费视频网站| 婷婷国产v国产偷v亚洲高清| 国产精品久久二区二区| 日韩欧美国产一二三区| 欧美日韩高清一区| 一本到不卡精品视频在线观看| 久久精品72免费观看| 亚洲r级在线视频| 一区二区欧美国产| 综合激情成人伊人| 国产精品卡一卡二卡三| 久久久久久久精| 久久久久久一级片| 国产精品久久久久桃色tv| 欧美在线短视频| 激情av综合网| 亚洲午夜激情网站| 国产蜜臀97一区二区三区| 国产69精品久久777的优势| 丝袜美腿亚洲一区二区图片| 国产精品麻豆久久久| 日韩一级欧美一级| 欧美在线免费播放| 欧美色图第一页| 欧美三级蜜桃2在线观看| 色又黄又爽网站www久久| 色菇凉天天综合网| 欧美三级资源在线| 在线观看91精品国产麻豆| 欧美色综合影院| 欧美日韩午夜在线| 7777精品久久久大香线蕉 | 在线亚洲免费视频| 欧美一区三区二区| 欧美一区二区三区视频在线 | 日韩中文字幕麻豆| 免费精品视频最新在线| 看片的网站亚洲| 久久国产精品99久久久久久老狼| 视频精品一区二区| 一区二区三区毛片| 日韩国产欧美在线观看| 五月激情综合色| 亚洲国产日产av| 成人在线视频首页| 97久久久精品综合88久久| 99re成人精品视频| 在线亚洲+欧美+日本专区| 欧美另类videos死尸| 色综合久久九月婷婷色综合| 91国偷自产一区二区三区成为亚洲经典| youjizz国产精品| 欧美丰满一区二区免费视频| 精品国产乱码久久| 久久久噜噜噜久噜久久综合| 国产日韩一级二级三级| 亚洲高清不卡在线观看| 日本美女一区二区三区视频| 美脚の诱脚舐め脚责91| 成人爱爱电影网址| 欧美精品第1页| 一区二区在线观看视频在线观看| 亚洲成av人综合在线观看| 美女视频黄频大全不卡视频在线播放| 91首页免费视频| 精品视频999| 久久精品视频网| 午夜精品久久久久久久久久久| 精品一区二区av| 国产酒店精品激情| 欧美少妇一区二区| 日韩毛片高清在线播放| 视频一区欧美精品| 99久久久久久99| 国产日韩三级在线| 一区二区三区日韩在线观看| 国产精品一区二区在线看| 欧美最新大片在线看| 国产精品美女久久久久久| 久久99热国产| 欧美日韩在线综合| 亚洲综合色视频| 欧美亚洲日本国产| 亚洲欧美色图小说| 成人黄页在线观看| 日韩三级视频在线看| 日韩专区中文字幕一区二区| 色婷婷综合久久久久中文 | 日产欧产美韩系列久久99| 欧美性生交片4| 香蕉成人伊视频在线观看| 欧洲精品在线观看| 亚洲激情中文1区| 91国偷自产一区二区开放时间| 国产精品乱码妇女bbbb| 成人午夜精品在线| 欧美国产精品一区| 99久久精品99国产精品| 亚洲日本在线看| 一本到一区二区三区| 亚洲影院免费观看| 欧美婷婷六月丁香综合色| 视频一区中文字幕国产| 91精品国产丝袜白色高跟鞋| 日本欧美肥老太交大片| 精品国产在天天线2019| 国产大片一区二区| 亚洲欧洲精品天堂一级| 色94色欧美sute亚洲线路一久| 亚洲一区二区黄色| 欧美一区二区国产| 国产在线播精品第三| 国产欧美日韩视频在线观看| 成人黄色国产精品网站大全在线免费观看| 国产精品无人区| 在线视频一区二区三区| 久久国产欧美日韩精品| 国产精品日韩成人| 欧美日韩一区高清| 国产一区视频导航| 国产欧美日韩三级| 成人av午夜影院| 一区二区三区精品在线观看| 777xxx欧美| 91在线精品秘密一区二区| 首页国产欧美久久| 国产精品理论在线观看| 中文字幕不卡的av| 91色视频在线| 丝袜美腿亚洲一区| 亚洲一区二区偷拍精品| 欧美一区二区在线播放| 欧美综合天天夜夜久久| 蜜臀国产一区二区三区在线播放 | 欧美一区二区三区在| 91天堂素人约啪| 粉嫩一区二区三区性色av| 久久国产精品99精品国产 | 亚洲午夜免费视频| 亚洲综合丝袜美腿| 亚洲精品国产精品乱码不99| 国产精品久久久久久久第一福利| 91精品国产综合久久精品图片| 色噜噜偷拍精品综合在线| 丁香婷婷综合五月| 另类小说图片综合网| 蜜臀av一区二区在线免费观看|