cpnav/lib/pages/pass_track/model/draw_context.dart
2024-09-06 09:11:06 +08:00

262 lines
6.6 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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