zk-draw
Version:
canvas绘制AI数据的一个工具类
158 lines (143 loc) • 3.92 kB
JavaScript
/*
* @Author: wangfpp
* @Date: 2020-04-27 18:34:59
* @Last Modified by: wangfpp
* @Last Modified time: 2020-06-05 18:00:34
*/
// 复制ctx的全部属性
const copyCtxConf = ctx => {
let obj = {};
for(let key in ctx) {
let config = ctx[key];
if (typeof config == 'function') {
continue
}
if (key === 'canvas') {
let canvas = {
offsetWidth: config.offsetWidth,
offsetHeight: config.offsetHeight
}
obj['canvas'] = canvas;
} else {
obj[key] = config
}
}
return obj;
}
/**
*
* @param {Array} points 框体坐标
* @param {Number} xkp
* @param {Number} ykp
*/
const getXyWh = (points, xkp, ykp) => { // 获取框的起点和宽高
let arr = kpArr(points, xkp, ykp);
let width = arr[2] - arr[0];
let height = arr[3] - arr[1];
let x = arr[2] - arr[0];
let y = arr[3] - arr[1];
let x1 = arr[0] + x/2; // 对角线中心点也是圆心
let y1 = arr[1] + y/2;
let cc = [x1, y1]; // 圆心
let r = Math.sqrt(((x1 - arr[0]) * (x1 - arr[0])) + ((y1 - arr[1]) * (y1 - arr[1])))
// console.log(x, y, r, cc);
return {kparr: arr, x: arr[0], y: arr[1], width: width, height: height, r: r, cc: cc};
}
/**
* @description 缩放坐标
* @param {Array} points
* @param {Number} xkp
* @param {Number} ykp
*/
const kpArr = (points, xkp, ykp) => {
let arr = []
points.forEach((item, index) => {
if (index % 2 === 0) {
arr.push(item * xkp)
} else {
arr.push(item * ykp)
}
});
return arr;
}
/**
* @description 数组扁平化
* @param {Array} arr
*/
const deepFlatten = arr => {
return [].concat(...arr.map(v => (Array.isArray(v) ? deepFlatten(v) : v)))
}
/**
* @description 颜色转化为rgba格式4通道透明
* @param {Number} alpha
*/
const colorRgb = function(alpha) {
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
var sColor = this.toLowerCase();
if (sColor && reg.test(sColor)) {
if (sColor.length === 4) {
var sColorNew = "#";
for (var i = 1; i < 4; i += 1) {
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
}
sColor = sColorNew;
}
//处理六位的颜色值
var sColorChange = [];
for (var i = 1; i < 7; i += 2) {
sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
}
return alpha ? `RGB(${sColorChange.join(",")}, ${alpha})` : "RGB(" + sColorChange.join(",") + ")";
} else {
return alpha ? `RGBA${sColor.split(')') + alpha})` : "RGB" + sColor;
}
};
/**
* 简单的数组拷贝功能
* @param {Object} o [待拷贝的对象]
* @return {Object} [拷贝后的对象]
*/
const deepCopy = (o) => {
if (o instanceof Array) {
var n = [];
for (var i = 0; i < o.length; ++i) {
n[i] = deepCopy(o[i]);
}
return n;
} else if (o instanceof Object) {
var n = {}
for (var i in o) {
n[i] = deepCopy(o[i]);
}
return n;
} else {
return o;
}
}
/**
* 分割数组
* @param {Number} N [按几个分割]
* @param {Array} Q [待分隔的数组]
* @return {[type]} [description]
*/
const splitArr = (N, Q) => {
var R = [];
for(var i = 0; i < Q.length;) {
R.push(Q.slice(i, i += N));
}
return R;
}
const getNodeById = (node) => {
if (node.nodeType && node.nodeType === 1) {
return node;
} else {
if (node.startsWith('#')) {
let nodeDom = document.querySelector(node);
return nodeDom;
} else {
let nodeDom = document.querySelector(`#${node}`);
return nodeDom;
}
}
}
export { copyCtxConf, getXyWh, kpArr, deepFlatten, colorRgb, deepCopy, splitArr, getNodeById };