NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/lib/geom/shape/edge.js
2023-09-14 14:47:11 +08:00

247 lines
6.0 KiB
Java

/**
* @fileOverview 边的 shape
* @author dxq613@gmail.com
*/
var Util = require('../../util');
var Shape = require('./shape');
var ShapeUtil = require('../util/shape');
var Global = require('../../global');
var PathUtil = require('../util/path');
var CORNER_PERCENT = 1 / 3;
function getAttrs(cfg) {
var defaultCfg = Global.shape.edge;
var lineAttrs = Util.mix({}, defaultCfg, cfg.style);
ShapeUtil.addStrokeAttrs(lineAttrs, cfg);
if (cfg.size) {
lineAttrs.lineWidth = cfg.size;
}
return lineAttrs;
}
var Edge = Shape.registerFactory('edge', {
defaultShapeType: 'line',
getDefaultPoints: function getDefaultPoints(pointInfo) {
return ShapeUtil.splitPoints(pointInfo);
},
getActiveCfg: function getActiveCfg(type, cfg) {
var lineWidth = cfg.lineWidth || 0;
return {
lineWidth: lineWidth + 1
};
}
});
function getCPath(from, to) {
var points = [];
points.push({
x: from.x,
y: from.y * (1 - 1 / 2) + to.y * 1 / 2
});
points.push({
y: from.y * (1 - 1 / 2) + to.y * 1 / 2,
x: to.x
});
points.push(to);
var sub = ['C'];
Util.each(points, function (point) {
sub.push(point.x, point.y);
});
return sub;
}
function getQPath(to, center) {
var points = [];
points.push({
x: center.x,
y: center.y
});
points.push(to);
var sub = ['Q'];
Util.each(points, function (point) {
sub.push(point.x, point.y);
});
return sub;
}
function createSmoothPath(from, to) {
var sub = getCPath(from, to);
var path = [['M', from.x, from.y]];
path.push(sub);
return path;
}
function createArcPath(from, to, center) {
var sub = getQPath(to, center);
var path = [['M', from.x, from.y]];
path.push(sub);
return path;
}
function createArcWeightPath(points, center) {
var arc1 = getQPath(points[1], center);
var arc2 = getQPath(points[3], center);
var path = [['M', points[0].x, points[0].y]];
path.push(arc2);
path.push(['L', points[3].x, points[3].y]);
path.push(['L', points[2].x, points[2].y]);
path.push(arc1);
path.push(['L', points[1].x, points[1].y]);
path.push(['L', points[0].x, points[0].y]);
path.push(['Z']);
return path;
}
function createRectPath(from, to) {
var points = [];
points.push({
y: from.y * (1 - CORNER_PERCENT) + to.y * CORNER_PERCENT,
x: from.x
});
points.push({
y: from.y * (1 - CORNER_PERCENT) + to.y * CORNER_PERCENT,
x: to.x
});
points.push(to);
var path = [['M', from.x, from.y]];
Util.each(points, function (point) {
path.push(['L', point.x, point.y]);
});
return path;
}
Shape.registerShape('edge', 'line', {
draw: function draw(cfg, container) {
var points = this.parsePoints(cfg.points);
var attrCfg = getAttrs(cfg);
var path = PathUtil.getLinePath(points);
var line = container.addShape('path', {
attrs: Util.mix(attrCfg, {
path: path
})
});
return line;
},
getMarkerCfg: function getMarkerCfg(cfg) {
return Util.mix({
symbol: 'circle',
radius: 4.5
}, getAttrs(cfg));
}
});
Shape.registerShape('edge', 'vhv', {
draw: function draw(cfg, container) {
var points = cfg.points;
var attrCfg = getAttrs(cfg);
var path = createRectPath(points[0], points[1]);
path = this.parsePath(path);
var line = container.addShape('path', {
attrs: Util.mix(attrCfg, {
path: path
})
});
return line;
},
getMarkerCfg: function getMarkerCfg(cfg) {
return Util.mix({
symbol: 'circle',
radius: 4.5
}, getAttrs(cfg));
}
});
Shape.registerShape('edge', 'smooth', {
draw: function draw(cfg, container) {
var points = cfg.points;
var attrCfg = getAttrs(cfg);
var path = createSmoothPath(points[0], points[1]);
path = this.parsePath(path);
var line = container.addShape('path', {
attrs: Util.mix(attrCfg, {
path: path
})
});
return line;
},
getMarkerCfg: function getMarkerCfg(cfg) {
return Util.mix({
symbol: 'circle',
radius: 4.5
}, getAttrs(cfg));
}
}); // 弧线包括笛卡尔坐标系下的半圆弧线、极坐标系下以圆心为控制点的二阶曲线、笛卡尔坐标系下带权重的三阶曲线、极坐标系下带权重的以圆心为控制点的二阶曲线
Shape.registerShape('edge', 'arc', {
draw: function draw(cfg, container) {
var points = cfg.points;
var type = points.length > 2 ? 'weight' : 'normal';
var attrCfg = getAttrs(cfg);
var line;
var path;
if (cfg.isInCircle) {
var center = {
x: 0,
y: 1
};
if (type === 'normal') {
path = createArcPath(points[0], points[1], center);
} else {
attrCfg.fill = attrCfg.stroke;
path = createArcWeightPath(points, center);
}
path = this.parsePath(path);
line = container.addShape('path', {
attrs: Util.mix(attrCfg, {
path: path
})
});
} else {
if (type === 'normal') {
points = this.parsePoints(points);
line = container.addShape('arc', {
attrs: Util.mix(attrCfg, {
x: (points[1].x + points[0].x) / 2,
y: points[0].y,
r: Math.abs(points[1].x - points[0].x) / 2,
startAngle: Math.PI,
endAngle: Math.PI * 2
})
});
} else {
path = [['M', points[0].x, points[0].y], ['L', points[1].x, points[1].y]];
var c1 = getCPath(points[1], points[3]);
var c2 = getCPath(points[2], points[0]);
path.push(c1);
path.push(['L', points[3].x, points[3].y]);
path.push(['L', points[2].x, points[2].y]);
path.push(c2);
path.push(['Z']);
path = this.parsePath(path);
attrCfg.fill = attrCfg.stroke;
line = container.addShape('path', {
attrs: Util.mix(attrCfg, {
path: path
})
});
}
}
return line;
},
getMarkerCfg: function getMarkerCfg(cfg) {
return Util.mix({
symbol: 'circle',
radius: 4.5
}, getAttrs(cfg));
}
});
module.exports = Edge;