public Point VectorToPoint(FigurePoint point) { var dx = point.x - x; var dy = point.y - y; return(new Point(dx, dy)); }
public bool IsOnBorder(FigurePoint p, PolygonFigure pf) { var points = pf.Points; bool onBorder = false; for (int i = 0; i < points.Count; i++) { int j = (i + 1) % points.Count; var p1 = points[i]; var p2 = points[j]; if (p1.x - p2.x == 0 && p1.x == p.x) { onBorder = p1.y < p2.y ? (p.y >= p1.y && p.y <= p2.y) : (p.y >= p2.y && p.y <= p1.y); } else if (p1.y - p2.y == 0 && p1.y == p.y) { onBorder = p1.x < p2.x ? (p.x >= p1.x && p.x <= p2.x) : (p.x >= p2.x && p.x <= p1.x); } else { var lc = new LineCutter(points[i], points[j], p, p); if (lc.SimpleCutYFormule(p.x) == p.y) { onBorder = p1.x < p2.x ? (p.x >= p1.x && p.x <= p2.x) : (p.x >= p2.x && p.x <= p1.x); } } if (onBorder) { return(true); } } return(false); }
private bool IsInPoligon(FigurePoint point, PolygonFigure pf) { int i1, i2, n, N, S, S1, S2, S3; bool flag = false; N = pf.Points.Count; var p = pf.Points; for (n = 0; n < N; n++) { flag = false; i1 = n < N - 1 ? n + 1 : 0; while (!flag) { i2 = i1 + 1; if (i2 >= N) { i2 = 0; } if (i2 == (n < N - 1 ? n + 1 : 0)) { break; } S = Math.Abs(p[i1].x * (p[i2].y - p[n].y) + p[i2].x * (p[n].y - p[i1].y) + p[n].x * (p[i1].y - p[i2].y)); S1 = Math.Abs(p[i1].x * (p[i2].y - point.y) + p[i2].x * (point.y - p[i1].y) + point.x * (p[i1].y - p[i2].y)); S2 = Math.Abs(p[n].x * (p[i2].y - point.y) + p[i2].x * (point.y - p[n].y) + point.x * (p[n].y - p[i2].y)); S3 = Math.Abs(p[i1].x * (p[n].y - point.y) + p[n].x * (point.y - p[i1].y) + point.x * (p[i1].y - p[n].y)); if (S == S1 + S2 + S3) { flag = true; break; } i1 = i1 + 1; if (i1 >= N) { i1 = 0; } } if (!flag) { break; } } return(flag); }
public LineCutter(FigurePoint cutterP1, FigurePoint cutterP2, FigurePoint figureP1, FigurePoint figureP2) { Cp1 = cutterP1; Cp2 = cutterP2; Fp1 = figureP1; Fp2 = figureP2; Cutdx = cutterP2.x - cutterP1.x; Cutdy = cutterP2.y - cutterP1.y; Cutk = (double)Cutdy / Cutdx; Figdx = figureP2.x - figureP1.x; Figdy = figureP2.y - figureP1.y; Figk = (double)Figdy / Figdx; }
private FigurePoint FindCutPoint(FigurePoint cutterP1, FigurePoint cutterP2, FigurePoint figureP1, FigurePoint figureP2) { if (cutterP2.x < cutterP1.x) { var p = cutterP1; cutterP1 = cutterP2; cutterP2 = p; } if (figureP2.x < figureP1.x) { var p = figureP1; figureP1 = figureP2; figureP2 = p; } var lc = new LineCutter(cutterP1, cutterP2, figureP1, figureP2); return(lc.getPoint()); }
private List <FigurePoint> FindCutPoints(FigurePoint p1, FigurePoint p2, PolygonFigure pf) { List <FigurePoint> list = new List <FigurePoint>(); for (int i = 0; i < pf.Points.Count; i++) { int j = (i + 1) % pf.Points.Count; list.Add(FindCutPoint(pf.Points[i], pf.Points[j], p1, p2)); } if (p2.x < p1.x) { list.Sort(new DecPointComparer()); list = list.Where(p => p.x != -1).ToList(); } else { list.Sort(new IncPointComparer()); list = list.Where(p => p.x != -1).ToList(); } return(list); }
public FigurePoint getPoint() { if ((Cp1.x == Cp2.x && Cp1.y == Cp2.y) || (Fp1.x == Fp2.x && Fp1.y == Fp2.y)) { return(new FigurePoint(-1, -1, LineDrawType.Solid)); } var isParallel = (Cutdx != 0 && Figdx != 0 && Cutdy != 0 && Figdy != 0 && Cutdx % Figdx == 0 && Cutdx * Figdx > 0 && Cutdy % Figdy == 0 && Cutdy * Figdy > 0) || (Cutdx == 0 && Figdx == 0) || (Cutdy == 0 && Figdy == 0); if (isParallel) { return(new FigurePoint(-1, -1, LineDrawType.Solid)); } int x; int y; if (Figdx == 0 || Cutdx == 0) { if (Figdy == 0 || Cutdy == 0) { x = VerticalAndHorizontalXFormule(); y = VerticalAndHorizontalYFormule(); } else { if (Figdx == 0) { y = FigureVerticalYFormule(); x = SimpleCutXFormule(y); } else { y = CutterVerticalYFormule(); x = SimpleFigXFormule(y); } } } else if (Figdy == 0 || Cutdy == 0) { if (Figdx == 0) { x = FigureHorizontalXFormule(); y = SimpleCutYFormule(x); } else { x = CutterHorizontalXFormule(); y = SimpleFigYFormule(x); } } else { x = GeneralizedXFormule(); y = SimpleCutYFormule(x); } var fp = new FigurePoint(x, y, LineDrawType.Solid); if (isValueNotInRange(x, Fp1.x, Fp2.x, Cp1.x, Cp2.x)) { return(new FigurePoint(-1, -1, LineDrawType.Solid)); } if (isValueNotInRange(y, Fp1.y, Fp2.y, Cp1.y, Cp2.y)) { return(new FigurePoint(-1, -1, LineDrawType.Solid)); } if (fp.Equals(Fp1) || fp.Equals(Fp2) || fp.Equals(Cp1) || fp.Equals(Cp2)) { return(new FigurePoint(-1, -1, LineDrawType.Solid)); } return(fp); }
public bool Equals(FigurePoint fp) { return(x == fp.x && y == fp.y); }