コード例 #1
0
ファイル: Form4.cs プロジェクト: mengran3275188/EntitasUnity
        private void DrawCircel(Pen pen, DashFireSpatial.Circle ci)
        {
            Vector3 center = ci.world_center_pos();

            graphics_.Graphics.DrawLine(pen, center.X, center.Z, center.X + 1, center.Z + 1);
            graphics_.Graphics.DrawEllipse(pen, (float)(center.X - ci.radius()),
                                           (float)(center.Z - ci.radius()), (float)ci.radius() * 2, (float)ci.radius() * 2);
        }
コード例 #2
0
ファイル: Collide.cs プロジェクト: yqxflong/DashFire
        //判断两个圆是否碰撞
        public bool IntersectCircle(Circle one, Circle two)
        {
            Vector3 one_center             = one.world_center_pos();
            Vector3 two_center             = two.world_center_pos();
            float   center_distance_square = DashFire.Geometry.DistanceSquare(one_center, two_center);
            float   radius = one.radius() + two.radius();

            if (radius * radius < center_distance_square)
            {
                return(false);
            }
            else
            {
                return(true);
            }
        }
コード例 #3
0
ファイル: Collide.cs プロジェクト: yqxflong/DashFire
        //判断矩形和圆是否分离
        public bool SeperatePolygonCircle(Vector3 axis_vector, Polygon rect, Circle circle)
        {
            float p00 = 1 - (float)Math.Pow(axis_vector.X, 2);
            float p01 = -axis_vector.X * axis_vector.Z;
            float p10 = p01;
            float p11 = 1 - (float)Math.Pow(axis_vector.Z, 2);

            //计算多边形的最大最小透影
            List <Vector3> one_list = rect.world_vertex();
            Vector3        one_min  = new Vector3(0, 0, 0);
            Vector3        one_max  = new Vector3(0, 0, 0);

            for (int i = 0; i < one_list.Count; i++)
            {
                Vector3 pass_pos = new Vector3(0, 0, 0);
                pass_pos.X = (float)(one_list[i].X * p00 + one_list[i].Z * p10);
                pass_pos.Z = (float)(one_list[i].X * p01 + one_list[i].Z * p11);
                if (i == 0)
                {
                    one_min = pass_pos;
                    one_max = pass_pos;
                }
                if (pass_pos.X < one_min.X ||
                    (pass_pos.X == one_min.X && pass_pos.Z < one_min.Z))
                {
                    one_min = pass_pos;
                }
                if (pass_pos.X > one_max.X ||
                    (pass_pos.X == one_max.X && pass_pos.Z > one_max.Z))
                {
                    one_max = pass_pos;
                }
            }

            //计算圆的最大最小透影
            float   two_min_x   = 0;
            float   two_min_y   = 0;
            float   two_max_x   = 0;
            float   two_max_y   = 0;
            Vector3 center      = circle.world_center_pos();
            Vector3 center_pass = new Vector3(0, 0, 0);

            center_pass.X = (float)(center.X * p00 + center.Z * p10);
            center_pass.Z = (float)(center.X * p01 + center.Z * p11);
            float half_x = circle.radius() * Math.Abs(axis_vector.Z);

            two_min_x = center_pass.X - half_x;
            two_max_x = center_pass.X + half_x;
            float half_y = circle.radius() * Math.Abs(axis_vector.X);

            two_min_y = center_pass.Z - half_y;
            two_max_y = center_pass.Z + half_y;

            //判断是否分离
            if (one_min.X > two_max_x ||
                (one_min.X == two_max_x && one_min.Z > two_max_y))
            {
                return(true);
            }
            if (one_max.X < two_min_x ||
                (one_max.X == two_min_x && one_max.Z < two_min_y))
            {
                return(true);
            }
            return(false);
        }