import 'dart:math'; import 'dart:typed_data'; import 'dart:convert'; import 'package:flutter/material.dart'; class DrawContext { DrawContext(); // 中心坐标 //左下角显示的坐标 double zeroDX = 0; double zeroDY = 0; //上一次的坐标 double zeroX = 0; double zeroY = 0; // 缩放 double scale = 1; double lastScale = 1; // 屏幕尺寸 Size screenSize = const Size(100, 100); //暂时没用 static int unit = 20; //弧度 double angle = 0; double lastAngle = 0; List grounScaleList = [ 78271.5170, 39135.7585, 19567.8792, 9783.9396, 4891.9698, 2445.9849, 1222.9925, 611.4962, 305.7481, 152.8741, 76.4370, 38.2185, 19.1093, 9.5546, 4.7773, 2.3887, 1.1943, 0.5972, 0.2986, 0.1493, 0.0746, 0.0373, 0.0187 ]; // 是否显示标尺 bool isRuler = false; bool isScale = true; // 是否显示地图 bool isMap = true; // 坐标点 List dotList = []; // 按下的点 int? currentDotIndex; //暂时没用 List polyonList = []; int polyonExpendIndex = 0; // 当前移动的点 Offset currentDot = const Offset(0, 0); //没用 int groundScaleIndex = 21; //偏移坐标 Offset pos = const Offset(0, 0); Offset lastPos = const Offset(0, 0); // 控制位移图的大小 bool isNomal = true; double mark = 1000;//显示当前比例尺,因为缩放的原因,比例尺有[8,40,200,1000];四种,默认倍数是100,那么mark默认1000 double space = 1; List? pointList; List> gengerateList = []; List devicePositioned=[]; /// @param {double} m - 米 m2px(double m) { return m / 20 / scale; } /// @param {double} px - 像素 px2m(double px) { return px * 20 / scale; } // x是平面坐标的竖直方向 /// @param {num} x - 坐标x /// @param {num} y - 坐标y // xy2Screen(num x, num y, [k = 1]) { // double screenx = (y / k * scale - zeroDX); // double screeny = (screenSize.height - (x / k * scale - zeroDY)); // return Offset(screenx, screeny); // } xy2Screen(num x, num y, [k = 1]) { double screenx = (y * k / (scale) - zeroDX); double screeny = (screenSize.height - (x * k / (scale) - zeroDY)); return Offset(screenx, screeny); } /// @param {screenOffset} x - 屏幕坐标Offset(x,y) screen2xy(Offset screenOffset, [k = 1]) { // double X = (screenOffset.dy / k * scale + zeroDX); // double Y = (screenSize.height - screenOffset.dx / k * scale + zeroDY); double Y = (screenOffset.dx+zeroDX)*scale/k; double X=(screenSize.height-screenOffset.dy+zeroDY)*scale/k; // double X = (screenOffset.dx * k + zeroDX); // double Y = (screenSize.height - screenOffset.dy * k + zeroDY); return Offset(X, Y); } //设置缩放 /// @param {Size} size - (width,height) setSize(Size size) { screenSize = size; if (screenSize != size) { setCenter(null); lastScale = scale; screenSize = size; } } // 设置中心坐标 // setCenter(obj, [k = 1]) { // if (obj != null) { // zeroDX = ((obj['y'] * k * scale - screenSize.width / 2).abs()) // .floor() // .toDouble(); // zeroDY = ((obj['x'] * k * scale - screenSize.height / 2).abs()) // .floor() // .toDouble(); // zeroX = (obj['x'] * k).toDouble(); // zeroY = (obj['y'] * k).toDouble(); // } else { // zeroDX = // ((zeroY * k * scale - screenSize.width / 2).abs()).floor().toDouble(); // zeroDY = ((zeroX * k * scale - screenSize.height / 2).abs()) // .floor() // .toDouble(); // } // } setCenter(obj, [k = 1]) { scale = 1; if (obj != null) { zeroDX = (((obj["x"] as num) / k / (scale) - screenSize.width / 2).abs()) .floor() .toDouble(); zeroDY = (((obj["y"] as num) / k / (scale) - screenSize.height / 2).abs()) .floor() .toDouble(); zeroX = ((obj["x"])).toDouble(); zeroY = ((obj["y"])).toDouble(); // print("$zeroDX,$zeroDY"); } else { zeroDX = ((zeroX / k / (scale)- screenSize.width / 2).abs()) .floor() .toDouble(); zeroDY = ((zeroY / k / (scale) - screenSize.height / 2).abs()) .floor() .toDouble(); } } // 没有用 // getGridStepXY() { // double dx = (zeroX % 100) * 20 / scale; // double dy = (zeroY % 100) * 20 / scale; // double step = // scaleList[scale.toInt() - 1 < 0 ? 0 : scale.toInt() - 1] / scale; // return GridStepXY(step, dx, dy); // } setZeroOffset(Offset pos) { //移动当前中心 zeroDX -= pos.dx; zeroDY += pos.dy; //将偏移值附加给存储的zeroX和Y,保证缩放的时候仍然保留之前的偏移量 zeroX -=pos.dx*scale ; zeroY += pos.dy*scale; } //设置当前移动点的坐标 setCurrentDot(Offset offset) { currentDot = offset; } setDotListIndex(Offset offset) { dotList[currentDotIndex!] = offset; } setDotList(List list) { dotList = list; } /// @param {int} index - 下标位置 setPolyonList(int index, List lists) { List arr = []; // List arr1 = []; for (int i = 0; i < lists.length; i++) { Offset list = screen2xy(lists[i]); arr.add(list); } polyonList[index].list = arr; } // 点到直线得距离 /// @param {Offset} dot - 3个点 double dot2Line(Offset dot1, Offset dot2, Offset dot) { double A = (dot1.dy - dot2.dy) / (dot1.dx - dot2.dx); //1,2直线的斜率 double B = dot1.dy - A * dot1.dx; //斜率 double distance = ((A * dot.dx + B - dot.dy) / sqrt(A * A + 1)).abs(); //求3和直线1,2的距离 return distance; } // 获取地面分辨率的索引,暂时没用 int getGroundScaleIndex(double sacle) { groundScaleIndex = grounScaleList.lastIndexWhere((el) => el > scale) + 1; return groundScaleIndex; } // 获取地面分辨率,暂时没用 double getGroundScale() { return grounScaleList[groundScaleIndex - 1]; } // 点的信息 pointInfo(Offset point) { if (pointList != null && pointList!.isNotEmpty) { for (var el in pointList!) { double x = ((el['dx'] as double) - point.dx).abs(); double y = ((el['dy'] as double) - point.dy).abs(); if (x <= 15 && y <= 15) { return el; } } } } } // 暂时没有用 class GridStepXY { double step; double dx; double dy; GridStepXY(this.step, this.dx, this.dy); } //暂时没用 class Polyon { String label; String key; bool expend; List list; Polyon(this.key, this.label, this.list, [this.expend = false]); }