cpnav/lib/pages/pass_track/model/draw_context.dart

262 lines
6.6 KiB
Dart
Raw Normal View History

2024-09-06 09:11:06 +08:00
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]);
}