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