• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            new BroadPhase (Sweep and Prune)

            轉(zhuǎn)自:http://www.codeplex.com/FarseerPhysics/Thread/View.aspx?ThreadId=16522


            I did a quick look through your most recent code and was kind of shocked to find out you still didn’t have a more efficient Broad Phase. So I decided to write one for your engine during my break. I tried to make it simple instead of optimized for ease of understanding.

            public class SweepAndPrune
            {
                
            delegate void CollisionCallback(Wrapper w1, Wrapper w2);
             
                
            class Wrapper
                
            {
                    
            public Node xBegin;
                    
            public Node xEnd;
                    
            public Node yBegin;
                    
            public Node yEnd;
                    
            public Geometry geometry;
                    
            public List<Geometry> colliders;
                    
            public Wrapper(Geometry geometry)
                    
            {
                        
            this.geometry = geometry;
                        
            this.colliders = new List<Geometry>();
                        
            this.xBegin = new Node(thistrue);
                        
            this.xEnd = new Node(thisfalse);
                        
            this.yBegin = new Node(thistrue);
                        
            this.yEnd = new Node(thisfalse);
                    }

                    
            public void Update()
                    
            {
                        colliders.Clear();
                        xBegin.value 
            = geometry.AABB.Min.X;
                        xEnd.value 
            = geometry.AABB.Max.X;
                        yBegin.value 
            = geometry.AABB.Min.Y;
                        yEnd.value 
            = geometry.AABB.Max.Y;
                    }

                }

             
                
            class Node
                
            {
                    
            public bool begin;
                    
            public float value;
                    
            public Wrapper wrapper;
                    
            public Node(Wrapper wrapper, bool begin)
                    
            {
                        
            this.wrapper = wrapper;
                        
            this.begin = begin;
                    }

                }

             
                List
            <Wrapper> wrappers = new List<Wrapper>();
                List
            <Node> xList = new List<Node>();
                List
            <Node> yList = new List<Node>();
             
                
            public void AddGeometry(Geometry item)
                
            {
                    Wrapper wrapper 
            = new Wrapper(item);
                    wrappers.Add(wrapper);
                    xList.Add(wrapper.xBegin);
                    xList.Add(wrapper.xEnd);
                    yList.Add(wrapper.yBegin);
                    yList.Add(wrapper.yEnd);
                }

                
            public void RemoveDisposed()
                
            {
                    
            if (wrappers.RemoveAll(delegate(Wrapper w) return w.geometry.Body.IsDisposed; }> 0)
                    
            {
                        xList.RemoveAll(
            delegate(Node n) return n.wrapper.geometry.Body.IsDisposed; });
                        yList.RemoveAll(
            delegate(Node n) return n.wrapper.geometry.Body.IsDisposed; });
                    }

                }

                
            public void Run()
                
            {
                    Update();
                    RunAxis(xList, HandleFirstCollision);
                    RunAxis(yList, HandleSecondCollision);
                }

                
            /// <summary>
                
            /// Updates the nodes and sorts them.
                
            /// </summary>

                void Update()
                
            {
                    
            foreach (Wrapper wrapper in wrappers)
                    
            {
                        wrapper.Update();
                    }

                    xList.Sort(
            delegate(Node l, Node r) return l.value.CompareTo(r.value); });
                    yList.Sort(
            delegate(Node l, Node r) return l.value.CompareTo(r.value); });
                }

                
            /// <summary>
                
            /// Runs the collision detection on a axis
                
            /// </summary>

                void RunAxis(List<Node> list, CollisionCallback callback)
                
            {
                    LinkedList
            <Wrapper> proximityList = new LinkedList<Wrapper>();
                    
            foreach (Node node in list)
                    
            {
                        
            if (node.begin)
                        
            {
                            
            foreach (Wrapper wrapper in proximityList)
                            
            {
                                callback(node.wrapper, wrapper);
                            }

                            proximityList.AddLast(node.wrapper);
                        }

                        
            else
                        
            {
                            proximityList.Remove(node.wrapper);
                        }

                    }

                }

                
            /// <summary>
                
            /// when there is a collsion along the first axis
                
            /// and if there is no early fail conditions then they are
                
            /// added to each others colliders list
                
            /// </summary>

                void HandleFirstCollision(Wrapper w1, Wrapper w2)
                
            {
                    
            //if(early fail conditions) {return;}
                    w1.colliders.Add(w2.geometry);
                    w2.colliders.Add(w1.geometry);
                }

                
            /// <summary>
                
            /// when there is a collision along the second axis then 
                
            /// it checks to see if there was a collision along the first. 
                
            /// if there is then the 2 geometries bounding boxes are colliding.
                
            /// </summary>

                void HandleSecondCollision(Wrapper w1, Wrapper w2)
                
            {
                    
            if (w1.colliders.Contains(w2.geometry))
                    
            {
                        
            //this is a confirmed broadphase collision
                        
            //so add a new arbiter or something for 
                        
            //w1.geometry and w2.geometry
                    }

                }

            }

            posted on 2008-01-09 17:31 楊粼波 閱讀(1363) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久精品国产亚洲AV影院| 91精品免费久久久久久久久| 亚洲精品乱码久久久久久中文字幕 | 7777久久亚洲中文字幕| 一本久久久久久久| 中文精品久久久久人妻| 狠狠色狠狠色综合久久| 久久综合狠狠色综合伊人| 性做久久久久久久久浪潮| 97精品伊人久久大香线蕉app| 无码人妻久久一区二区三区蜜桃| 久久99精品国产麻豆| 人妻无码久久精品| 久久美女人爽女人爽| 77777亚洲午夜久久多喷| 久久电影网| 国产伊人久久| 久久美女人爽女人爽| 69SEX久久精品国产麻豆| 伊人久久综合精品无码AV专区| 国产精品一区二区久久精品无码 | 99久久精品国产高清一区二区| 欧美激情精品久久久久久久| www亚洲欲色成人久久精品| 久久精品无码午夜福利理论片| 噜噜噜色噜噜噜久久| 看全色黄大色大片免费久久久| 伊人丁香狠狠色综合久久| 国产精品久久国产精麻豆99网站| 精品久久久一二三区| 99精品国产免费久久久久久下载| 亚洲国产精品一区二区久久| 国产精品久久免费| 久久免费高清视频| 久久精品国产精品国产精品污| 91精品国产91久久久久福利| 色欲综合久久中文字幕网| 久久久久亚洲av成人网人人软件| 一本大道久久香蕉成人网| 久久影院亚洲一区| 国产激情久久久久久熟女老人 |