262 lines
6.6 KiB
Dart
262 lines
6.6 KiB
Dart
|
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<double> 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<List<double>> gengerateList = [];
|
|||
|
List<Widget> 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]);
|
|||
|
}
|