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]);
|
||
}
|