• <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>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            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)

            轉自: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 楊粼波 閱讀(1358) 評論(0)  編輯 收藏 引用

            久久精品国产一区二区三区| 久久精品国产精品亜洲毛片| 狠狠色综合网站久久久久久久高清 | 无码人妻久久一区二区三区蜜桃| 看全色黄大色大片免费久久久 | 久久久久国产精品嫩草影院| 99久久精品免费看国产一区二区三区| 久久久久久久久久久久久久| 麻豆精品久久精品色综合| 久久久久99精品成人片| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久精品成人欧美大片| 亚洲伊人久久大香线蕉苏妲己| 久久只有这里有精品4| 久久综合九色综合久99| 2021最新久久久视精品爱| 欧美777精品久久久久网| 中文无码久久精品| 久久精品国产精品亚洲下载 | 欧洲精品久久久av无码电影| 久久久久国产精品嫩草影院| 国产69精品久久久久777| 久久久久亚洲AV成人网人人网站| 久久天堂电影网| 久久人人爽人人爽人人AV | 久久久久久久综合日本| 一本色道久久88加勒比—综合| 精品无码久久久久久尤物| 国产∨亚洲V天堂无码久久久| 亚洲欧美精品一区久久中文字幕| 国产高潮国产高潮久久久91| 久久99精品国产麻豆宅宅| 99久久国语露脸精品国产| 久久亚洲精品成人AV| 欧洲成人午夜精品无码区久久| 国产精品成人久久久| 久久经典免费视频| 久久精品国产亚洲av麻豆蜜芽| 亚洲AV伊人久久青青草原| 一本综合久久国产二区| 久久久久久曰本AV免费免费|