示例#1
0
        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);
        }
示例#2
0
        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);
        }