From ac5139566be8957be2f885b64850c09d35bebb38 Mon Sep 17 00:00:00 2001
From: lizhanwei <Dana_Lee1016@126.com>
Date: 星期三, 18 三月 2020 10:58:46 +0800
Subject: [PATCH] 增加路考绘图;两个点推出第三个点;增加路考地图对应的json类

---
 app/src/main/java/safeluck/drive/evaluation/Constant.java                      |    1 
 app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java |  201 ++++++++++++++++++++++++
 app/src/main/java/safeluck/drive/evaluation/util/Utils.java                    |   73 +++++++++
 app/src/main/java/safeluck/drive/evaluation/bean/Point.kt                      |    3 
 app/src/main/java/safeluck/drive/evaluation/bean/RoadExamMap.java              |  131 ++++++++++++++++
 app/src/main/assets/roadmap.json                                               |   11 +
 app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java          |    2 
 7 files changed, 414 insertions(+), 8 deletions(-)

diff --git a/app/src/main/assets/roadmap.json b/app/src/main/assets/roadmap.json
new file mode 100644
index 0000000..1504d68
--- /dev/null
+++ b/app/src/main/assets/roadmap.json
@@ -0,0 +1,11 @@
+[{
+  "id": 863,
+  "item": 1,
+  "point": [{
+    "x-y": [1,5,2,5,3,5,4,5,5,5,6,5,6,6,7,6,7,5,8,5,9,5,10,5,11,5,12,5,12,3,11,3,10,3,9,3,8,3,7,3,6,3,5,3,4,3,3,3,2,3,1,3
+    ]
+  }
+  ]
+
+  }
+]                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
\ No newline at end of file
diff --git a/app/src/main/java/safeluck/drive/evaluation/Constant.java b/app/src/main/java/safeluck/drive/evaluation/Constant.java
index f91b4ad..6bbbcec 100644
--- a/app/src/main/java/safeluck/drive/evaluation/Constant.java
+++ b/app/src/main/java/safeluck/drive/evaluation/Constant.java
@@ -53,6 +53,7 @@
     //I绫昏瘎鍒よ〃
     public static final int SUBJECT_I = 1;
     public static final String MAP = "map.json";
+    public static final String ROAD_MAP = "roadmap.json";
     public static final String VEHICLE = "vehiclemodel.json";
     public static final String BIND_RTKCONFIG_TOPIC = "rtkconfig_topic";
 
diff --git a/app/src/main/java/safeluck/drive/evaluation/bean/Point.kt b/app/src/main/java/safeluck/drive/evaluation/bean/Point.kt
new file mode 100644
index 0000000..9617b91
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/bean/Point.kt
@@ -0,0 +1,3 @@
+package safeluck.drive.evaluation.bean
+
+data class Point(var X:Double, var Y:Double)
\ No newline at end of file
diff --git a/app/src/main/java/safeluck/drive/evaluation/bean/RoadExamMap.java b/app/src/main/java/safeluck/drive/evaluation/bean/RoadExamMap.java
new file mode 100644
index 0000000..61e93b4
--- /dev/null
+++ b/app/src/main/java/safeluck/drive/evaluation/bean/RoadExamMap.java
@@ -0,0 +1,131 @@
+package safeluck.drive.evaluation.bean;
+
+import java.util.List;
+
+public class RoadExamMap {
+
+    private List<Double> points;
+    private List<MapsBean> maps;
+
+    public List<Double> getPoints() {
+        return points;
+    }
+
+    public void setPoints(List<Double> points) {
+        this.points = points;
+    }
+
+    public List<MapsBean> getMaps() {
+        return maps;
+    }
+
+    public void setMaps(List<MapsBean> maps) {
+        this.maps = maps;
+    }
+
+    public static class MapsBean {
+        /**
+         * id : 1005
+         * item : 100
+         * red_line : [[1,2,3],[1,2,3]]
+         * green_line : [[1,2,3],[1,2,3]]
+         * trigger_line : [[1,2,3],[1,2,3]]
+         * red_area : [[2,3,4,5],[2,3,4,5]]
+         * tts : 鍓嶆柟鍙宠浆
+         * start_line : [15,16]
+         * end_line : [22,23]
+         * stop_flag : 0
+         */
+
+        private int id;
+        private int item;
+        private String tts;
+        private int stop_flag;
+        private List<List<Integer>> red_line;
+        private List<List<Integer>> green_line;
+        private List<List<Integer>> trigger_line;
+        private List<List<Integer>> red_area;
+        private List<Integer> start_line;
+        private List<Integer> end_line;
+
+        public int getId() {
+            return id;
+        }
+
+        public void setId(int id) {
+            this.id = id;
+        }
+
+        public int getItem() {
+            return item;
+        }
+
+        public void setItem(int item) {
+            this.item = item;
+        }
+
+        public String getTts() {
+            return tts;
+        }
+
+        public void setTts(String tts) {
+            this.tts = tts;
+        }
+
+        public int getStop_flag() {
+            return stop_flag;
+        }
+
+        public void setStop_flag(int stop_flag) {
+            this.stop_flag = stop_flag;
+        }
+
+        public List<List<Integer>> getRed_line() {
+            return red_line;
+        }
+
+        public void setRed_line(List<List<Integer>> red_line) {
+            this.red_line = red_line;
+        }
+
+        public List<List<Integer>> getGreen_line() {
+            return green_line;
+        }
+
+        public void setGreen_line(List<List<Integer>> green_line) {
+            this.green_line = green_line;
+        }
+
+        public List<List<Integer>> getTrigger_line() {
+            return trigger_line;
+        }
+
+        public void setTrigger_line(List<List<Integer>> trigger_line) {
+            this.trigger_line = trigger_line;
+        }
+
+        public List<List<Integer>> getRed_area() {
+            return red_area;
+        }
+
+        public void setRed_area(List<List<Integer>> red_area) {
+            this.red_area = red_area;
+        }
+
+        public List<Integer> getStart_line() {
+            return start_line;
+        }
+
+        public void setStart_line(List<Integer> start_line) {
+            this.start_line = start_line;
+        }
+
+        public List<Integer> getEnd_line() {
+            return end_line;
+        }
+
+        public void setEnd_line(List<Integer> end_line) {
+            this.end_line = end_line;
+        }
+    }
+}
diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java
index e930588..8e8137d 100644
--- a/app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java
+++ b/app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java
@@ -415,8 +415,6 @@
                     canvas.drawBitmap(bmp, 0, 0, paint);
                     holder.unlockCanvasAndPost(canvas);
                 }
-//            }
-//        });
     }
     public void DrawMapAll(List<Double> mainAnt, final double[][][] map, final double[][] car,
                         List<Integer>body, List<Integer> tire) {
diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java
index dc1cafc..0843923 100644
--- a/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java
+++ b/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java
@@ -1,5 +1,6 @@
 package safeluck.drive.evaluation.fragment;
 
+import android.graphics.Bitmap;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
@@ -15,10 +16,20 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
+import com.anyun.exam.lib.MyLog;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
 import me.yokeyword.fragmentation.SupportFragment;
+import safeluck.drive.evaluation.Constant;
+import safeluck.drive.evaluation.bean.ExamMap;
+import safeluck.drive.evaluation.util.FileUtil;
 
 public class RoadDriveMapFragment extends SupportFragment implements SurfaceHolder.Callback {
 
@@ -28,12 +39,17 @@
     private SurfaceHolder mSurfaceHolder;
     private boolean flag = false;//鎺у埗缁樺埗绾跨▼drawThread
     private Canvas mCanvas;
+    private Canvas bitMapCanvas;
     private Paint mPaint;
     private Path mPath;
+    private StringBuffer buffer;//瀛樻斁鍦板浘鐨刡uffer
+    private Gson gson = new Gson();
 
     private int avaliableWidth,avaliableHeight;
 
     private int x = 50, y = 50, r = 10; // 鍦嗙殑鍧愭爣鍜屽崐寰�
+    private int sinx = 0,siny =0 ;
+    float [] pts={50,100,100,200,200,300,300,400};
 
     private ExecutorService generateData = Executors.newSingleThreadExecutor();//浜х敓鏁版嵁锛堜富瑕佹槸杞﹁締鏁版嵁锛�
     private ExecutorService drawThread = Executors.newSingleThreadExecutor();//缁樺埗绾跨▼
@@ -55,13 +71,38 @@
         avaliableWidth = mSurfaceView.getWidth();
         Log.i(TAG,"鍙敤瀹藉害="+avaliableWidth+"鍙敤楂樺害="+avaliableHeight);
         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+        mPaint.setStyle(Paint.Style.STROKE);
+        mPaint.setStrokeWidth(1.5f);
         mPath = new Path();
 
+        int widhtpixels =getResources().getDisplayMetrics().widthPixels;
+        int heightpixels =getResources().getDisplayMetrics().heightPixels;
+        Log.i(TAG,"widhtpixels="+widhtpixels+" heig="+heightpixels);
         return mSurfaceView;
     }
 
     @Override
     public void surfaceCreated(SurfaceHolder holder) {
+//        mCanvas = holder.lockCanvas();
+//        int screen_width = mCanvas.getWidth();
+//        int screen_height = mCanvas.getHeight();
+//        Bitmap bmp = Bitmap.createBitmap(screen_width, screen_height, Bitmap.Config.ARGB_8888);
+//        bitMapCanvas = new Canvas(bmp);
+//        bitMapCanvas.drawColor(Color.WHITE);
+//
+//        mPaint = new Paint();
+//
+//        mPaint.setTextSize(30);
+//        mPaint.setColor(Color.BLACK);
+//        mPaint.setStrokeWidth(1.5f);
+//        mPaint.setAntiAlias(true);
+//        mPaint.setStyle(Paint.Style.STROKE);
+//
+//        mCanvas.drawBitmap(bmp,0,0,mPaint);
+//        holder.unlockCanvasAndPost(mCanvas);
+
+
+        flag = true;
         drawThread.execute(new DrawRunnable());
     }
 
@@ -76,15 +117,161 @@
         flag = false;
     }
 
-
+    List<ExamMap> examMaps = new ArrayList<>();
     /**
      * 涓昏鏄繖涓柟娉曪紝杩涜鍧愭爣鐐硅绠楋紝浣跨敤mPath鐢诲浘锛屽彲鑳借鐢ㄥ埌Canvas
      * 鏈�濂藉彧浣跨敤path
      */
     private void calculate() {
-        mPath.addCircle(x,y,r, Path.Direction.CCW);
+        int map_id = 863;
+        int map_line = 0;
+        double map[][]={};
+
+        if (buffer == null){
+
+            buffer = FileUtil.readAssetTxtFile(_mActivity, Constant.ROAD_MAP);
+            Log.i(TAG,"ditu="+buffer.toString().trim());
+        }
+        Type type = new TypeToken<List<ExamMap>>(){}.getType();
+        if (buffer != null){
+            examMaps= gson.fromJson(buffer.toString().trim(), type);
+        }
+
+        for (int i = 0; i < examMaps.size(); i++) {
+            ExamMap examMap = examMaps.get(i);
+            if (map_id == examMap.getId()){
+                List<ExamMap.PointBean> pointBeanList = examMap.getPoint();
+
+                for(int j=0; j<pointBeanList.size();j++){
+                    List<Double> xys = pointBeanList.get(j).getXy();
+                    if(j==0){
+                        map = new double[xys.size()/2][2];
+
+
+
+                        for (int k=0; k<xys.size();k++){
+                            if ((k % 2) == 0) {
+                                map[map_line][0] = xys.get(k);
+                                Log.i(TAG, "onCEvent: map鏂板��=" + map[map_line][0] + " 浣嶇疆锛�" + k);
+                            } else {
+                                double value = 0-xys.get(k);
+
+
+                                map[map_line][1] = value;
+                                map_line++;
+                            }
+                        }
+                    }else{
+                        MyLog.i(TAG,"鏆傛椂鏀寔鏇茬嚎");
+                        break;
+                    }
+
+
+
+                }
+                break;
+            }
+        }
+        onDrawMap(map);
+//        mPaint.reset();
+//        mPaint.setStyle(Paint.Style.FILL);
+//        mPaint.setColor(Color.RED);
+//        mPath.addCircle(x,y,r, Path.Direction.CCW);
+//
+//        mCanvas.drawPath(mPath,mPaint);
+//
+//
+//        mPaint.reset();
+//        mPaint.setStyle(Paint.Style.FILL);
+//        mPaint.setColor(Color.GREEN);
+//        mCanvas.drawCircle(x+100,y+100,70,mPaint);
+//
+//
+//        mPaint.reset();
+//        mPath = new Path();
+//        mPaint.setColor(Color.GREEN);
+//        mPaint.setStyle(Paint.Style.STROKE);
+//        mPaint.setStrokeWidth(1.5f);
+//
+//        mPath.moveTo(pts[0],pts[1]);
+//        mPath.lineTo(pts[2],pts[3]);
+//        mCanvas.drawPath(mPath,mPaint);
+
+
+
+        if (mCanvas != null){
+            //閲婃斁canvas瀵硅薄骞舵彁浜ょ敾甯�
+            mSurfaceHolder.unlockCanvasAndPost(mCanvas);
+        }
+
     }
 
+
+
+private void onDrawMap(final double map[][]){
+    double base_x = 300, base_y = 20;
+    double max_x = 0, min_x = 0, max_y = 0, min_y = 0;
+
+    Log.d(TAG, "DrawMap map size " + map.length + " car size " );
+
+    for (int i = 0; i < map.length; i++) {
+        if (i == 0) {
+            max_x = map[0][0];
+            min_x = map[0][0];
+            max_y = map[0][1];
+            min_y = map[0][1];
+        } else {
+            if (max_x < map[i][0]) {
+                max_x = map[i][0];
+            }
+            if (min_x > map[i][0]) {
+                min_x = map[i][0];
+            }
+            if (max_y < map[i][1]) {
+                max_y = map[i][1];
+            }
+            if (min_y > map[i][1]) {
+                min_y = map[i][1];
+            }
+        }
+    }
+    long scale_x = Math.round((mCanvas.getWidth() - base_x - 10) / (max_x - min_x));
+    long scale_y = Math.round((mCanvas.getHeight() - base_y - 10) / (max_y - min_y));
+
+    if (scale_x >= scale_y) {
+        scale_x = scale_y;
+    } else {
+        scale_y = scale_x;
+    }
+
+    mPaint.reset();
+    mPaint.setAntiAlias(true);
+    mPaint.setColor(Color.BLACK);
+    mPaint.setStyle(Paint.Style.STROKE);
+    mPaint.setStrokeWidth(1.5f);
+
+
+
+    if (map.length > 9) {
+        Log.d(TAG, "DrawMap X = " + String.format("%f", (float) (base_x + (map[0][0] - min_x) * scale_x)) + " Y = " + String.format("%f", (float) (base_y + (map[0][1] - min_y) * scale_y)));
+        mPath.moveTo((float) (base_x + (map[0][0] - min_x) * scale_x), (float) (base_y + (map[0][1] - min_y) * scale_y));
+        for (int i = 1; i < map.length; i++) {
+            Log.d(TAG, "DrawMap to X = " + (float) (base_x + (map[i][0] - min_x) * scale_x) + " Y = " + (float) (base_y + (map[i][1] - min_y) * scale_y));
+            mPath.lineTo((float) (base_x + (map[i][0] - min_x) * scale_x), (float) (base_y + (map[i][1] - min_y) * scale_y));
+        }
+        mPath.close();
+        mCanvas.drawPath(mPath,mPaint);
+    }
+mPaint.reset();
+        mPath = new Path();
+    mPaint.setStyle(Paint.Style.STROKE);
+    mPaint.setStrokeWidth(1.5f);
+    mPaint.setColor(Color.RED);
+    mPath.moveTo(300,150);
+    mPath.lineTo(1015,150);
+
+    mCanvas.drawPath(mPath,mPaint);
+}
 
     /**
      * 缁樺埗
@@ -95,15 +282,17 @@
             mCanvas = mSurfaceHolder.lockCanvas();
             //缁樺埗鑳屾櫙
             mCanvas.drawColor(Color.WHITE);
+            Log.i(TAG,"width="+mCanvas.getWidth()+"height:"+mCanvas.getHeight());
             //缁樺埗璺緞
             mCanvas.drawPath(mPath, mPaint);
         }catch (Exception e){
 
         }finally {
-            if (mCanvas != null){
-                //閲婃斁canvas瀵硅薄骞舵彁浜ょ敾甯�
-                mSurfaceHolder.unlockCanvasAndPost(mCanvas);
-            }
+//            if (mCanvas != null){
+//                mCanvas.restore();
+//                //閲婃斁canvas瀵硅薄骞舵彁浜ょ敾甯�
+//                mSurfaceHolder.unlockCanvasAndPost(mCanvas);
+//            }
         }
 
     }
diff --git a/app/src/main/java/safeluck/drive/evaluation/util/Utils.java b/app/src/main/java/safeluck/drive/evaluation/util/Utils.java
index 689ee59..b53bcf2 100644
--- a/app/src/main/java/safeluck/drive/evaluation/util/Utils.java
+++ b/app/src/main/java/safeluck/drive/evaluation/util/Utils.java
@@ -1,6 +1,7 @@
 package safeluck.drive.evaluation.util;
 
 import android.content.res.Resources;
+import android.graphics.PointF;
 import android.os.SystemClock;
 import android.util.Log;
 import android.util.TypedValue;
@@ -17,6 +18,13 @@
 import javax.crypto.SecretKey;
 import javax.crypto.SecretKeyFactory;
 import javax.crypto.spec.DESKeySpec;
+
+import safeluck.drive.evaluation.bean.Point;
+
+import static java.lang.Math.cos;
+import static java.lang.Math.pow;
+import static java.lang.Math.sin;
+import static java.lang.Math.toRadians;
 
 /**
  * MyApplication2
@@ -312,6 +320,71 @@
         System.out.println("intCurrTIme="+CurrTIme);
         int unsignedTime=  parseUnsignedInt(String.valueOf(longCurrTIme),10);
         System.out.println("unsigned int time = "+unsignedTime);
+
+Point p1 = new Point(1.0,2.0);
+Point p2 = new Point(3.0,4.0);
+        System.out.println(Calc3Point(p1,p2,5.0).toString());
+    }
+
+    public static Point Calc3Point(Point p1,Point p2,double L ){
+        Point p3 = new Point(0.0,0.0);
+        System.out.println(p1.toString()+" "+p2.toString());
+        if (isEqual(p1.getX(), p2.getX())) {
+            p3.setY( p2.getY());
+            if (p2.getY() > p1.getY()) {
+                p3.setX(p2.getX() - L);
+            } else {
+                p3.setX(p2.getX() + L)  ;
+            }
+            return p3;
+        }
+        if (isEqual(p1.getY(), p2.getY())) {
+            p3.setX(p2.getX());
+            if (p2.getX() > p1.getX()) {
+                p3.setY(p2.getY()+L);
+            } else {
+                p3.setY(p2.getY() - L);
+            }
+            return p3;
+        }
+
+        double k = (p2.getY() - p1.getY()) / (p2.getX() - p1.getX());
+        double b = p1.getY() - k*p1.getX();
+
+        double A = 1 + pow(k, 2);
+        double B = 2*k*(b - p2.getY()) - 2*p2.getX();
+        double C = pow(b - p2.getY(), 2) + pow(p2.getX(), 2) - pow(L,2);
+
+        double x3, y3;
+
+
+        if (p1.getX() < p2.getX()) {
+            x3 = (- B - Math.sqrt(pow(B, 2) - 4*A*C))/(2*A);
+        } else {
+            x3 = (- B + Math.sqrt(pow(B, 2) - 4*A*C))/(2*A);
+        }
+        y3 = k * x3 + b;
+
+        p3.setX(x3);
+        p3.setY(y3);
+
+        p3 = rotatePoint(p3, p2, 270);
+
+        return p3;
+
+    }
+
+    private static boolean isEqual(double a,double b){
+        return (Math.abs(a-b)<1e-3);
+    }
+    private static Point rotatePoint(Point oldPoint,Point centre,double degree){
+
+        Point newPoint = new Point(0.0,0.0);
+        newPoint.setX((oldPoint.getX()-centre.getX())*cos(toRadians(degree)) -
+                (oldPoint.getY()-centre.getY())*sin(toRadians(degree)) + centre.getX()) ;
+        newPoint.setY( (oldPoint.getX()-centre.getX())*sin(toRadians(degree))
+                + (oldPoint.getY()-centre.getY())*cos(toRadians(degree)) + centre.getY());
+        return newPoint;
     }
 
 }

--
Gitblit v1.8.0