private Boolean is_point_in_line(Point p, mLineSegment line) // is given point lies in given line? { double Ax, Ay, Bx, By, Cx, Cy; Bx = line.end_point.X; By = line.end_point.Y; Ax = line.start_point.X; Ay = line.start_point.Y; Cx = p.X; Cy = p.Y; double line_lenght = line.get_lenght(); double s = Math.Abs(((Ay - Cy) * (Bx - Ax) - (Ax - Cx) * (By - Ay)) / (line_lenght * line_lenght)); if (Math.Abs(s - 0) < 0.00001) // does it lie in or very near to line? { if (is_points_equal(p, line.start_point) || is_points_equal(p, line.end_point)) { return(true); } else if ((Cx < line.get_x_max()) && (Cx > line.get_x_min()) && (Cy < line.get_y_max()) && (Cy > line.get_y_min())) { return(true); } } // if CS:IP reaches here, means point does not lie in the line return(false); }
private Boolean is_point_in_triangle(Point[] triangle, Point p) // check if given point lies in a given triangle { if (triangle.Length != 3) // check if we have exact-3 points of triangle { return(false); } for (int i = triangle.GetLowerBound(0); i < triangle.GetUpperBound(0); i++) // loop triangles vertexes { if (is_points_equal(p, triangle[i])) // given point is equal or very near to one of given triangles vertices { return(true); } } // check line segments of given triangle mLineSegment l1 = new mLineSegment(triangle[0], triangle[1]); mLineSegment l2 = new mLineSegment(triangle[1], triangle[2]); mLineSegment l3 = new mLineSegment(triangle[2], triangle[0]); if (is_point_in_line(p, l1) || is_point_in_line(p, l2) || is_point_in_line(p, l3)) // if point lies in one of triangles lines { return(true); } // check interior triangle area double area0 = mPolygon.PolygonArea(new Point[] { triangle[0], triangle[1], p }); double area1 = mPolygon.PolygonArea(new Point[] { triangle[1], triangle[2], p }); double area2 = mPolygon.PolygonArea(new Point[] { triangle[2], triangle[0], p }); if ((area0 > 0) && (area1 > 0) && (area2 > 0)) { return(true); } else if ((area0 < 0) && (area1 < 0) && (area2 < 0)) { return(true); } // if CS:IP reaches here, this means given point passed test and not in anywhere in the triangle return(false); }