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

            日韩AV无码久久一区二区| 色综合久久综合中文综合网| 久久九九有精品国产23百花影院| 久久国产精品77777| 欧美777精品久久久久网| 欧美精品久久久久久久自慰| 久久久久av无码免费网| 久久国产精品久久精品国产| 四虎影视久久久免费| 日韩人妻无码精品久久免费一| 无码日韩人妻精品久久蜜桃 | 久久久青草青青国产亚洲免观| 天天爽天天狠久久久综合麻豆| 久久国产精品无| 久久无码中文字幕东京热| 久久久久久精品免费看SSS| 伊人久久久AV老熟妇色| 久久久精品波多野结衣| 久久99国产综合精品免费| 久久久久综合中文字幕| 人妻无码精品久久亚瑟影视| 久久精品99久久香蕉国产色戒 | 性做久久久久久久久久久| 欧美久久天天综合香蕉伊| 影音先锋女人AV鲁色资源网久久 | 久久精品一区二区影院| 亚洲AV伊人久久青青草原| 亚洲愉拍99热成人精品热久久| 国产高潮国产高潮久久久| 久久人人爽人人爽人人片AV东京热| 久久综合色区| 俺来也俺去啦久久综合网| 婷婷久久综合九色综合九七| 久久精品国产亚洲AV嫖农村妇女 | 亚洲伊人久久成综合人影院 | 精品久久久久久国产潘金莲| 久久久WWW成人免费毛片| 久久精品国产亚洲AV无码偷窥| 久久久久黑人强伦姧人妻| 99久久精品国内| 久久久久国产精品|