| | |
| | | } |
| | | } |
| | | |
| | | class Line { |
| | | double X1; |
| | | double Y1; |
| | | double X2; |
| | | double Y2; |
| | | |
| | | public Line(double x1, double y1, double x2, double y2) { |
| | | this.X1 = x1; |
| | | this.Y1 = y1; |
| | | this.X2 = x2; |
| | | this.Y2 = y2; |
| | | } |
| | | } |
| | | |
| | | private enum Relation { |
| | | GM_None, |
| | | GM_Tangent, |
| | | GM_Intersection, |
| | | GM_Containment |
| | | }; |
| | | |
| | | public PointF rotatePoint(PointF oldPoint, PointF centre, double degree) { |
| | | PointF newPoint = new PointF(0, 0); |
| | | |
| | |
| | | newPoint.setY ( (oldPoint.getX()-centre.getX())*Math.sin(Math.toRadians(degree)) + (oldPoint.getY()-centre.getY())*Math.cos(Math.toRadians(degree)) + centre.getY() ); |
| | | |
| | | return newPoint; |
| | | } |
| | | |
| | | boolean isEqual(double a, double b) |
| | | { |
| | | return (Math.abs(a - b) <= 1e-6); |
| | | } |
| | | |
| | | Relation IntersectionOf(Line line1, Line line2) |
| | | { |
| | | if ((isEqual(line1.X1, line1.X2) && isEqual(line1.Y1, line1.Y2)) || (isEqual(line2.X1, line2.X2) && isEqual(line2.Y1, line2.Y2))) |
| | | return Relation.GM_None; |
| | | |
| | | if ((isEqual(line1.X1, line2.X1) && isEqual(line1.Y1, line2.Y1)) || (isEqual(line1.X2, line2.X1) && isEqual(line1.Y2, line2.Y1))) |
| | | return Relation.GM_Intersection; |
| | | |
| | | if ((isEqual(line1.X1, line2.X2) && isEqual(line1.Y1, line2.Y2)) || (isEqual(line1.X2, line2.X2) && isEqual(line1.Y2, line2.Y2))) |
| | | return Relation.GM_Intersection; |
| | | |
| | | line1.X2 -= line1.X1; line1.Y2 -= line1.Y1; |
| | | line2.X1 -= line1.X1; line2.Y1 -= line1.Y1; |
| | | line2.X2 -= line1.X1; line2.Y2 -= line1.Y1; |
| | | |
| | | double distAB = Math.sqrt(line1.X2 * line1.X2 + line1.Y2 * line1.Y2); |
| | | |
| | | double theCos = line1.X2 / distAB; |
| | | double theSin = line1.Y2 / distAB; |
| | | double newX = line2.X1 * theCos + line2.Y1 * theSin; |
| | | |
| | | line2.Y1 = line2.Y1 * theCos - line2.X1 * theSin; |
| | | line2.X1 = newX; |
| | | newX = line2.X2 * theCos + line2.Y2 * theSin; |
| | | line2.Y2 = line2.Y2 * theCos - line2.X2 * theSin; |
| | | line2.X2 = newX; |
| | | |
| | | if ((line2.Y1 < 0 && line2.Y2 < 0) || (line2.Y1 >= 0 && line2.Y2 >= 0)) { |
| | | return Relation.GM_None; |
| | | } |
| | | |
| | | double posAB = line2.X2 + (line2.X1 - line2.X2) * line2.Y2 / (line2.Y2 - line2.Y1); |
| | | |
| | | if (posAB < 0 || posAB > distAB) { |
| | | return Relation.GM_None; |
| | | } |
| | | |
| | | return Relation.GM_Intersection; |
| | | } |
| | | |
| | | Relation IntersectionOf(Line line, double screen_w, double screen_h) |
| | | { |
| | | boolean tangent = false; |
| | | |
| | | Line line1 = new Line(0, 0, screen_w, 0); |
| | | Line line2 = new Line(screen_w, 0, screen_w, screen_h); |
| | | Line line3 = new Line(screen_w, screen_h, 0, screen_h); |
| | | Line line4 = new Line(0, screen_h, 0, 0); |
| | | |
| | | Relation relation = IntersectionOf(line, line1); |
| | | if (relation == Relation.GM_Intersection) { |
| | | return relation; |
| | | } |
| | | if (relation == Relation.GM_Tangent) { |
| | | tangent = true; |
| | | } |
| | | |
| | | relation = IntersectionOf(line, line2); |
| | | if (relation == Relation.GM_Intersection) { |
| | | return relation; |
| | | } |
| | | if (relation == Relation.GM_Tangent) { |
| | | tangent = true; |
| | | } |
| | | |
| | | relation = IntersectionOf(line, line3); |
| | | if (relation == Relation.GM_Intersection) { |
| | | return relation; |
| | | } |
| | | if (relation == Relation.GM_Tangent) { |
| | | tangent = true; |
| | | } |
| | | |
| | | relation = IntersectionOf(line, line4); |
| | | if (relation == Relation.GM_Intersection) { |
| | | return relation; |
| | | } |
| | | if (relation == Relation.GM_Tangent) { |
| | | tangent = true; |
| | | } |
| | | |
| | | if (tangent) |
| | | return Relation.GM_Tangent; |
| | | |
| | | if (line.X1 > 0 && line.X1 < screen_w && line.Y1 > 0 && line.Y1 < screen_h) |
| | | return Relation.GM_Containment; |
| | | |
| | | return Relation.GM_None; |
| | | } |
| | | |
| | | static int angg = 0; |
| | |
| | | |
| | | int draw_status = 0; |
| | | |
| | | for (int z = 0; z < line.size(); z++) { |
| | | for (int z = 0; z < line.size() - 1; z++) { |
| | | float scr_x = (float) (base_x + (map[line.get(z)][0] - min_x) * scale_x); |
| | | float scr_y = (float) (base_y + (map[line.get(z)][1] - min_y) * scale_y); |
| | | |
| | | if (scr_x >= 0 && scr_x <= bmp.getWidth() && scr_y >= 0 && scr_y <= bmp.getHeight()) { |
| | | float scr_x2 = (float) (base_x + (map[line.get(z+1)][0] - min_x) * scale_x); |
| | | float scr_y2 = (float) (base_y + (map[line.get(z+1)][1] - min_y) * scale_y); |
| | | |
| | | Line linex = new Line(scr_x, scr_y, scr_x2, scr_y2); |
| | | |
| | | Relation relation = IntersectionOf(linex, bmp.getWidth(), bmp.getHeight()); |
| | | |
| | | if (relation == Relation.GM_Intersection || relation == Relation.GM_Containment) { |
| | | if (draw_status == 0) { |
| | | path.moveTo(scr_x, scr_y); |
| | | path.lineTo(scr_x2, scr_y2); |
| | | draw_status = 1; |
| | | } else if (draw_status == 1) { |
| | | path.lineTo(scr_x, scr_y); |
| | | path.lineTo(scr_x2, scr_y2); |
| | | } |
| | | } else if (draw_status == 1) { |
| | | canvas2.drawPath(path, paint); |
| | |
| | | |
| | | int draw_status = 0; |
| | | |
| | | for (int z = 0; z < line.size(); z++) { |
| | | for (int z = 0; z < line.size()-1; z++) { |
| | | float scr_x = (float) (base_x + (map[line.get(z)][0] - min_x) * scale_x); |
| | | float scr_y = (float) (base_y + (map[line.get(z)][1] - min_y) * scale_y); |
| | | |
| | | if (scr_x >= 0 && scr_x <= bmp.getWidth() && scr_y >= 0 && scr_y <= bmp.getHeight()) { |
| | | float scr_x2 = (float) (base_x + (map[line.get(z+1)][0] - min_x) * scale_x); |
| | | float scr_y2 = (float) (base_y + (map[line.get(z+1)][1] - min_y) * scale_y); |
| | | |
| | | Line linex = new Line(scr_x, scr_y, scr_x2, scr_y2); |
| | | |
| | | Relation relation = IntersectionOf(linex, bmp.getWidth(), bmp.getHeight()); |
| | | |
| | | if (relation == Relation.GM_Intersection || relation == Relation.GM_Containment) { |
| | | if (draw_status == 0) { |
| | | edgePath.moveTo(scr_x, scr_y); |
| | | path.lineTo(scr_x2, scr_y2); |
| | | draw_status = 1; |
| | | } else if (draw_status == 1) { |
| | | edgePath.lineTo(scr_x, scr_y); |
| | | edgePath.lineTo(scr_x2, scr_y2); |
| | | } |
| | | } else if (draw_status == 1) { |
| | | canvas2.drawPath(edgePath, paint); |
| | |
| | | |
| | | int draw_status = 0; |
| | | |
| | | for (int za = 0; za < points.size(); za++) { |
| | | for (int za = 0; za < points.size()-1; za++) { |
| | | float scr_x = (float) (base_x + (map[points.get(za)][0] - min_x) * scale_x); |
| | | float scr_y = (float) (base_y + (map[points.get(za)][1] - min_y) * scale_y); |
| | | |
| | | float scr_x2 = (float) (base_x + (map[points.get(za+1)][0] - min_x) * scale_x); |
| | | float scr_y2 = (float) (base_y + (map[points.get(za+1)][1] - min_y) * scale_y); |
| | | |
| | | Line linex = new Line(scr_x, scr_y, scr_x2, scr_y2); |
| | | |
| | | Relation relation = IntersectionOf(linex, bmp.getWidth(), bmp.getHeight()); |
| | | if (scr_x >= 0 && scr_x <= bmp.getWidth() && scr_y >= 0 && scr_y <= bmp.getHeight()) { |
| | | if (draw_status == 0) { |
| | | sepPath.moveTo(scr_x, scr_y); |
| | | sepPath.lineTo(scr_x2, scr_y2); |
| | | draw_status = 1; |
| | | } else if (draw_status == 1) { |
| | | sepPath.lineTo(scr_x, scr_y); |
| | | sepPath.lineTo(scr_x2, scr_y2); |
| | | } |
| | | } else if (draw_status == 1) { |
| | | canvas2.drawPath(sepPath, paint); |