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


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


            久久国产乱子伦精品免费午夜| 久久精品国产清高在天天线| 久久高潮一级毛片免费| 久久国产福利免费| 久久影院久久香蕉国产线看观看| 婷婷久久综合| 午夜精品久久久久久99热| 久久精品国产网红主播| 久久AAAA片一区二区| 无码乱码观看精品久久| 久久久久亚洲av无码专区导航 | 国产aⅴ激情无码久久| 韩国免费A级毛片久久| 久久夜色精品国产亚洲av| 囯产极品美女高潮无套久久久| 成人国内精品久久久久影院| 久久国产精品免费| 漂亮人妻被黑人久久精品| 久久高潮一级毛片免费| 精品无码久久久久国产| 久久一区二区免费播放| 久久99精品久久只有精品| 精品人妻伦一二三区久久| 亚洲色欲久久久综合网东京热| 国产午夜精品久久久久九九电影 | 久久精品中文字幕久久| 亚洲国产成人精品女人久久久| 九九精品99久久久香蕉| 人妻丰满?V无码久久不卡| 91久久婷婷国产综合精品青草| 久久久综合香蕉尹人综合网| 久久66热人妻偷产精品9| 久久亚洲精品国产亚洲老地址| 99久久99久久精品国产片| 性色欲网站人妻丰满中文久久不卡| 国产精品久久久天天影视香蕉 | 久久久久久国产精品无码超碰| 欧美日韩成人精品久久久免费看 | 久久免费看黄a级毛片| 国产综合精品久久亚洲| 国产91色综合久久免费|