【发布时间】:2020-02-23 16:30:54
【问题描述】:
我目前正在研究一种使用 Javascript 创建单线图的方法。我目前可以使用以下函数连接两个 html 元素:
adjustLine (from, to, line) {
var fT = from.offsetTop + from.offsetHeight/2;
var tT = to.offsetTop + to.offsetHeight/2;
var fL = from.offsetLeft + from.offsetWidth/2;
var tL = to.offsetLeft + to.offsetWidth/2;
var CA = Math.abs(tT - fT);
var CO = Math.abs(tL - fL);
var H = Math.sqrt(CA*CA + CO*CO);
var ANG = 180 / Math.PI * Math.acos( CA/H );
if(tT > fT){
var top = (tT-fT)/2 + fT;
}else{
var top = (fT-tT)/2 + tT;
}
if(tL > fL){
var left = (tL-fL)/2 + fL;
}else{
var left = (fL-tL)/2 + tL;
}
if(( fT < tT && fL < tL) || ( tT < fT && tL < fL) || (fT > tT && fL > tL) || (tT > fT && tL > fL)){
ANG *= -1;
}
top-= H/2;
line.style["-webkit-transform"] = 'rotate('+ ANG +'deg)';
line.style["-moz-transform"] = 'rotate('+ ANG +'deg)';
line.style["-ms-transform"] = 'rotate('+ ANG +'deg)';
line.style["-o-transform"] = 'rotate('+ ANG +'deg)';
line.style["-transform"] = 'rotate('+ ANG +'deg)';
line.style.top = top+'px';
line.style.left = left+'px';
line.style.height = H + 'px';
}
该函数有3个参数:
- 1) 第一个html元素
- 2) 第二个html元素
- 3) 连接元素的线。
这工作正常并输出以下结果:
但是,连接 html 元素的线是一条直线,我希望图表的流程更自然,如下所示:
对我该如何做这件事有什么建议吗?非常感谢任何帮助!
编辑
我正在使用 html2canvas 创建生成输出的图像。这是我的代码:
var myDiv = document.getElementById('content');
html2canvas(myDiv, {useCORS: true, allowTaint : true}).then(function (canvas) {
var imgData = canvas.toDataURL("image/png", 1.0);
var imgData2 = canvas2.toDataURL("image/png", 1.0);
var pdf = new jsPDF('l', 'pt', [HTML_Width, HTML_Height]);
pdf.internal.scaleFactor = 30;
pdf.addImage(imgData, 'PNG', 0, 0, HTML_Width, HTML_Height);
pdf.addPage();
pdf.addImage(imgData2, 'PNG', 0, 0, HTML_Width_2, HTML_Height_2);
pdf.save("my_file.pdf");
});
【问题讨论】:
-
你能上传剩下的代码吗?
-
@JacekRojek 当然,这是 CodePen 中的代码:codepen.io/MejorCodigo/pen/YzXpmYY。
-
这看起来有点矫枉过正,但我会这样。考虑一下曼哈顿距离:x 轴计数加倍。然后从 A 点到 B 点做 Astar。(这有利于先到顶部)。然后对于点 C 到 B,您已经绘制了画布,A 星将避免越线并应保持“旁边”。这是 5 分钟的随机想法
-
A* 实现对于这个来说是多余的,但肯定会起作用。单个对象的行数是否有限制?这个系统需要多动态?用户交互可以移动元素,实时更新线条吗?连接元素的数量是预先知道的还是动态添加的?
-
@Phelaxz 嗨,每个对象都使用 json 文件动态添加到
<div>... 我知道应该打印多少元素以及每个元素的父/子,用户也应该不要移动元素,因此不需要实时更新线条,理想情况下每个连接应该有 2 条线。
标签: javascript html diagram