public static bool Intersect(Coord2D p11, Coord2D p12, Coord2D p21, Coord2D p22) { bool b1 = crossZ(p22 - p21, p11 - p21) * crossZ(p22 - p21, p12 - p21) <= 0; bool b2 = crossZ(p12 - p11, p21 - p11) * crossZ(p12 - p11, p22 - p11) <= 0; return(b1 && b2); }
private bool hit(Coord2D hit, Coord2D infinity) { int cnt = 0; for (int i = 0; i < Outline.Count; i++) { var p0 = Outline[i]; var p1 = Outline[(i + 1) % Outline.Count]; if (LineSegment.Intersect(hit, infinity, p0, p1)) { cnt++; } } return(cnt % 2 == 1); }
public static float Dot(Coord2D p1, Coord2D p2) => p1.X * p2.X + p1.Y * p2.Y;
public bool Hit(Coord2D shoot) { return (hit(shoot, new Coord2D(1.9999f, 2.0001f)) || hit(shoot, new Coord2D(shoot.Y, -1.9999f))); }
private static double crossZ(Coord2D v1, Coord2D v2) { return(v1.X * v2.Y - v1.Y * v2.X); }