From debd3f045e174045c0229b2ce2e3982e8b853294 Mon Sep 17 00:00:00 2001
From: fctom1215 <fctom1215@outlook.com>
Date: 星期日, 26 七月 2020 20:42:59 +0800
Subject: [PATCH] 坐标
---
app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragmentaa.java | 155 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 147 insertions(+), 8 deletions(-)
diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragmentaa.java b/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragmentaa.java
index d878241..a1be614 100644
--- a/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragmentaa.java
+++ b/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragmentaa.java
@@ -231,6 +231,27 @@
}
}
+ 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);
@@ -238,6 +259,101 @@
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;
@@ -811,16 +927,24 @@
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);
@@ -869,16 +993,24 @@
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);
@@ -936,16 +1068,23 @@
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);
--
Gitblit v1.8.0