//------------------------------------------------------------------------------------------------------------------- /* * _____ _ _ _ _ _____ _ _ _ * / ____(_) | | | | (_) |_ _| | | | | (_) * | | _ _ __ ___| | ___ ______| | _ _ __ ___ ______| | _ __ | |_ ___ _ __ ___ ___ ___| |_ _ ___ _ __ * | | | | '__/ __| |/ _ \______| | | | '_ \ / _ \______| | | '_ \| __/ _ \ '__/ __|/ _ \/ __| __| |/ _ \| '_ \ * | |____| | | | (__| | __/ | |____| | | | | __/ _| |_| | | | || __/ | \__ \ __/ (__| |_| | (_) | | | | * \_____|_|_| \___|_|\___| |______|_|_| |_|\___| |_____|_| |_|\__\___|_| |___/\___|\___|\__|_|\___/|_| |_| * *Credits Corey(L$) * */ public static CircInter GetCircleLineInteraction(Vector3 from, Vector2 to, Vector2 cPos, float radius) { var res = new CircInter(); var dx = from.X - to.X; var dy = from.Y - to.Y; var a = dx * dx + dy * dy; var b = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y)); var c = (to.X - cPos.X) * (to.X - cPos.X) + (to.Y - cPos.Y) * (to.Y - cPos.Y) - radius * radius; var det = b * b - 4 * a * c; if ((a <= 0.0000001) || (det < 0)) { res.None = true; } else if (det == 0) { res.One = true; var t = -b / (2 * a); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); } else { var t = (float)((-b + Math.Sqrt(det)) / (2 * a)); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); t = (float)((-b - Math.Sqrt(det)) / (2 * a)); res.Inter2 = new Vector2(to.X + t * dx, to.Y + t * dy); } return(res); }
public static CircInter GetCicleLineInteraction(Vector2 from, Vector2 to, Vector2 cPos, float radius) { var res = new CircInter(); var dx = from.X - to.X; var dy = from.Y - to.Y; var A = dx * dx + dy * dy; var B = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y)); var C = (to.X - cPos.X) * (to.X - cPos.X) + (to.Y - cPos.Y) * (to.Y - cPos.Y) - radius * radius; var det = B * B - 4 * A * C; if ((A <= 0.0000001) || (det < 0)) { res.None = true; // No real solutions. } else if (det == 0) { res.One = true; // One solution. var t = -B / (2 * A); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); } else { // Two solutions. var t = (float)((-B + Math.Sqrt(det)) / (2 * A)); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); t = (float)((-B - Math.Sqrt(det)) / (2 * A)); res.Inter2 = new Vector2(to.X + t * dx, to.Y + t * dy); } return(res); }
public static CircInter GetCicleLineInteraction(Vector2 from, Vector2 to, Vector2 cPos, float radius) { var res = new CircInter(); var dx = from.X - to.X; var dy = from.Y - to.Y; var A = dx * dx + dy * dy; var B = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y)); var C = (to.X - cPos.X) * (to.X - cPos.X) + (to.Y - cPos.Y) * (to.Y - cPos.Y) - radius * radius; var det = B * B - 4 * A * C; if ((A <= 0.0000001) || (det < 0)) { res.None = true; // No real solutions. } else if (det == 0) { res.One = true; // One solution. var t = -B / (2 * A); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); } else { // Two solutions. var t = (float)((-B + Math.Sqrt(det)) / (2 * A)); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); t = (float)((-B - Math.Sqrt(det)) / (2 * A)); res.Inter2 = new Vector2(to.X + t * dx, to.Y + t * dy); } return res; }
//------------------------------------------------------------------------------------------------------------------- /* * _____ _ _ _ _ _____ _ _ _ * / ____(_) | | | | (_) |_ _| | | | | (_) * | | _ _ __ ___| | ___ ______| | _ _ __ ___ ______| | _ __ | |_ ___ _ __ ___ ___ ___| |_ _ ___ _ __ * | | | | '__/ __| |/ _ \______| | | | '_ \ / _ \______| | | '_ \| __/ _ \ '__/ __|/ _ \/ __| __| |/ _ \| '_ \ * | |____| | | | (__| | __/ | |____| | | | | __/ _| |_| | | | || __/ | \__ \ __/ (__| |_| | (_) | | | | * \_____|_|_| \___|_|\___| |______|_|_| |_|\___| |_____|_| |_|\__\___|_| |___/\___|\___|\__|_|\___/|_| |_| * *Credits Corey(L$) * */ public static CircInter GetCircleLineInteraction(Vector3 from, Vector2 to, Vector2 cPos, float radius) { var res = new CircInter(); var dx = from.X - to.X; var dy = from.Y - to.Y; var a = dx * dx + dy * dy; var b = 2 * (dx * (to.X - cPos.X) + dy * (to.Y - cPos.Y)); var c = (to.X - cPos.X) * (to.X - cPos.X) + (to.Y - cPos.Y) * (to.Y - cPos.Y) - radius * radius; var det = b * b - 4 * a * c; if ((a <= 0.0000001) || (det < 0)) { res.None = true; } else if (det == 0) { res.One = true; var t = -b / (2 * a); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); } else { var t = (float)((-b + Math.Sqrt(det)) / (2 * a)); res.Inter1 = new Vector2(to.X + t * dx, to.Y + t * dy); t = (float)((-b - Math.Sqrt(det)) / (2 * a)); res.Inter2 = new Vector2(to.X + t * dx, to.Y + t * dy); } return res; }