lizhanwei
2020-03-18 ac5139566be8957be2f885b64850c09d35bebb38
增加路考绘图;两个点推出第三个点;增加路考地图对应的json类
4个文件已修改
3个文件已添加
422 ■■■■■ 已修改文件
app/src/main/assets/roadmap.json 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/Constant.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/bean/Point.kt 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/bean/RoadExamMap.java 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/util/Utils.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/assets/roadmap.json
New file
@@ -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
    ]
  }
  ]
  }
]
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";
app/src/main/java/safeluck/drive/evaluation/bean/Point.kt
New file
@@ -0,0 +1,3 @@
package safeluck.drive.evaluation.bean
data class Point(var X:Double, var Y:Double)
app/src/main/java/safeluck/drive/evaluation/bean/RoadExamMap.java
New file
@@ -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;
        }
    }
}
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) {
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;//存放地图的buffer
    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);
//            }
        }
    }
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;
    }
}