app/src/main/assets/roadmap.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/Constant.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/bean/Point.kt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/bean/RoadExamMap.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/fragment/MapFragment.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
app/src/main/java/safeluck/drive/evaluation/util/Utils.java | ●●●●● 补丁 | 查看 | 原始文档 | 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; } }