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); }
//判断两个圆是否碰撞 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); } }
//判断矩形和圆是否分离 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); }