0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

圖撲 HT 總線式拓?fù)鋱D的可視化實(shí)現(xiàn)

圖撲-數(shù)字孿生 ? 來源:圖撲-數(shù)字孿生 ? 作者:圖撲-數(shù)字孿生 ? 2025-02-25 11:26 ? 次閱讀

在圖形用戶界面(GUI)設(shè)計(jì)中,自定義連線技術(shù)不僅提升了用戶體驗(yàn),還為復(fù)雜數(shù)據(jù)可視化開辟了新的可能性。該功能點(diǎn)允許用戶靈活地在界面元素之間創(chuàng)建視覺連接,使流程圖、思維導(dǎo)圖和網(wǎng)絡(luò)拓?fù)鋱D等信息呈現(xiàn)更加直觀和動(dòng)態(tài)。

圖撲軟件自研 HT for Web 產(chǎn)品框架中,ht.Edge 節(jié)點(diǎn)用于表示節(jié)點(diǎn)間的連線關(guān)系。熟悉 HT 的用戶應(yīng)該了解 ht.Edge 內(nèi)置了多種連線類型,能滿足一般拓?fù)鋱D需求,但在特殊情況下,這些默認(rèn)類型可能無法滿足需求。為此,HT 提供了自定義連線功能,允許開發(fā)者根據(jù)具體需求創(chuàng)建特殊的連線類型,實(shí)現(xiàn)更靈活的圖形表示。

wKgZPGe9OGaAZHD5ADcgFJXcIps367.gifwKgZO2e9OGyASup4AAfhoU5E-sY641.gif

自定義連線

圖撲 HT 框架提供靈活的自定義連線功能,開發(fā)者可以通過調(diào)用 ht.Default.setEdgeType(type, func, mutual) 方法來創(chuàng)建獨(dú)特的連線類型。以下是該方法的參數(shù)詳解:

■type:自定義連線類型的名稱,與 style 中的 edge.type 屬性相對應(yīng)。

■func:計(jì)算連線路徑信息的函數(shù),接收四個(gè)參數(shù):

gap:多條連線成捆時(shí),本連線對象對應(yīng)中心連線的間距。

edge:當(dāng)前連線對象。

graphView:當(dāng)前對應(yīng)拓?fù)浣M件對象。

sameSourceWithFirstEdge:boolean 類型,該連線是否與同組的第一條連線同源。

■mutual:決定該連線類型是否會(huì)影響同一起始或結(jié)束節(jié)點(diǎn)上的其他連線。

接下來,我們深入分析一種常見的拓?fù)潢P(guān)系實(shí)現(xiàn)步驟,即"橫-豎-橫"的連線方式。

下面是一段定義上圖連線類型的示例代碼。代碼很簡單,首先獲取起始節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn)的信息,然后根據(jù)這兩個(gè)節(jié)點(diǎn)的坐標(biāo),按照預(yù)定的規(guī)則計(jì)算出連線的路徑點(diǎn)。

ht.Default.setEdgeType('horizontal-vertical', function (edge, gap, graphView) {

const points = new ht.List();

const segments = new ht.List();

const source = edge.getSource();

const target = edge.getTarget();

const sourceP = source.p();

const targetP = target.p();

points.add(sourceP);

if (targetP.x !== sourceP.x) {

points.add({ x: sourceP.x + (targetP.x - sourceP.x) / 2, y: sourceP.y });

points.add({ x: sourceP.x + (targetP.x - sourceP.x) / 2, y: targetP.y });

}

points.add(targetP);

return { points, segments };

})

定義好連線類型后,只需通過 edge.s('edge.type', 'horizontal-vertical') 這段簡單的代碼行,就能將 edge 對象的連線設(shè)置為我們剛剛定義的類型。由此一來,即可看到令人滿意的效果,大幅提升圖形的可讀性和美觀度。

總線拓?fù)?/strong>

總線拓?fù)涫且环N網(wǎng)絡(luò)結(jié)構(gòu),所有設(shè)備(如計(jì)算機(jī)、打印機(jī)等)都連接到一個(gè)共同的通信介質(zhì)上,通常是一根電纜,這個(gè)介質(zhì)被稱為"總線"(bus)。總線拓?fù)湓?a target="_blank">工業(yè)控制嵌入式系統(tǒng)等特定領(lǐng)域中被廣泛應(yīng)用。在圖撲 HT 框架中,我們可以利用 ht.Shape 組件繪制總線,并通過 ht.Edge 組件將各個(gè)設(shè)備節(jié)點(diǎn)連接到總線上。這些連接的視覺表現(xiàn)可通過自定義連線類型靈活定義,從而實(shí)現(xiàn)精確的總線拓?fù)鋱D表示。

上面展示的是一個(gè)總線的示例效果,可以直觀看到所有設(shè)備都連接到了總線上。在具體實(shí)現(xiàn)過程中,最具挑戰(zhàn)性的問題是:如何計(jì)算出總線上距離目標(biāo)節(jié)點(diǎn)坐標(biāo)最近的點(diǎn)?

計(jì)算節(jié)點(diǎn)到總線距離

總線通常由多條直線段組成,因此計(jì)算某一節(jié)點(diǎn)到總線的最短距離可按以下思路進(jìn)行:

將總線分割為多段直線

總線由多個(gè)直線段構(gòu)成,可以取總線上相鄰兩點(diǎn)構(gòu)成一條直線。具體實(shí)現(xiàn)時(shí),遍歷 points 數(shù)據(jù),獲取 points[index] 和 points[index+1] 作為線段的兩個(gè)端點(diǎn)。注意,如果設(shè)置了 segments,其中 1 代表新路徑的起點(diǎn),所以當(dāng) segments[index+1] 為 1 時(shí)應(yīng)跳過。

計(jì)算點(diǎn)到每條直線的距離

獲取每條直線段后,計(jì)算節(jié)點(diǎn)坐標(biāo)到各線段的距離,并將距離值存入一個(gè)集合中。

獲取最短距離

從距離集合中找出最小值,即為節(jié)點(diǎn)到總線的最短距離。

基于上述思路,我們可以實(shí)現(xiàn)一個(gè)總線連線類型。以下是具體的實(shí)現(xiàn)代碼:

// 計(jì)算點(diǎn)到直線的距離,返回結(jié)果是個(gè)對象結(jié)構(gòu)

var pointToInsideLine = function (p1, p2, p) {

var x1 = p1.x,

y1 = p1.y,

x2 = p2.x,

y2 = p2.y,

x = p.x,

y = p.y,

result = {},

dx = x2 - x1,

dy = y2 - y1,

d = Math.sqrt(dx * dx + dy * dy),

ca = dx / d, // cosine

sa = dy / d, // sine

mX = (-x1 + x) * ca + (-y1 + y) * sa;

result.x = x1 + mX * ca;

result.y = y1 + mX * sa;

if (!isPointInLine(result, p1, p2)) {

result.x = Math.abs(result.x - p1.x) < Math.abs(result.x - p2.x) ? p1.x : p2.x;

result.y = Math.abs(result.y - p1.y) < Math.abs(result.y - p2.y) ? p1.y : p2.y;

}

dx = x - result.x;

dy = y - result.y;

result.z = Math.sqrt(dx * dx + dy * dy);

return result;

};

// 判斷點(diǎn)是否在線上

var isPointInLine = function (p, p1, p2) {

return p.x >= Math.min(p1.x, p2.x) &&

p.x <= Math.max(p1.x, p2.x) &&

p.y >= Math.min(p1.y, p2.y) &&

p.y <= Math.max(p1.y, p2.y);

};

// 注冊連線類型

ht.Default.setEdgeType('bus', function (edge) {

var source = edge.getSourceAgent(),

target = edge.getTargetAgent();

var targetP = target.p();

var points = source.getPoints().toArray();

var segments = source.getSegments();

var beginPoint;

for (let i = 0; i < points.length - 1; i++) {

if (segments) {

if (segments[i + 1] === 1) continue;

}

const point1 = points[i];

const point2 = points[i + 1];

const minPosition = pointToInsideLine(point1, point2, targetP);

if (!beginPoint || minPosition.z < beginPoint.z) {

beginPoint = minPosition;

}

}

return {

points: new ht.List([ beginPoint, targetP ]),

segments: new ht.List([1, 2])

};

});

執(zhí)行上述代碼后,我們將得到如下效果:

從上圖可以清楚看出,示例成功獲取了節(jié)點(diǎn)到總線的最近點(diǎn),并繪制了相應(yīng)的連線節(jié)點(diǎn)。值得注意的是,對于直線段而言,節(jié)點(diǎn)在直線上的投影點(diǎn)即為其距總線最近的點(diǎn)。

視覺美感優(yōu)化

雖然示例已實(shí)現(xiàn)了基礎(chǔ)總線效果,但由于拓?fù)鋱D采用 2.5D 效果,僅計(jì)算投影點(diǎn)可能無法呈現(xiàn)理想的視覺效果。為了增強(qiáng)視覺表現(xiàn),我們可以考慮讓連線旋轉(zhuǎn)一定角度。為此,我們可以在現(xiàn)有功能的基礎(chǔ)上添加旋轉(zhuǎn)代碼,使連線與整體圖形更加協(xié)調(diào),提升視覺美感。

ht.Default.setEdgeType('bus', function (edge) {

var source = edge.getSourceAgent(),

target = edge.getTargetAgent();

var targetP = target.p();

var points = source.getPoints().toArray();

var segments = source.getSegments();

var beginPoint, linePoints;

for (let i = 0; i < points.length - 1; i++) {

if (segments) {

if (segments[i + 1] === 1) continue;

}

const point1 = points[i];

const point2 = points[i + 1];

const minPosition = pointToInsideLine(point1, point2, targetP);

if (!beginPoint || minPosition.z < beginPoint.z) {

beginPoint = minPosition;

linePoints = [point1, point2]

}

}

var rotation = angleBetweenLineAndHorizontal(linePoints[0], linePoints[1]);

var rotatePoint = findIntersection([rotatePointAroundAnotherPoint(beginPoint, targetP, rotation), targetP], linePoints);

if(isPointInLine(rotatePoint, linePoints[0], linePoints[1])){

beginPoint = rotatePoint;

}

return {

points: new ht.List([

beginPoint, targetP

]),

segments: new ht.List([1, 2])

};

});

/**

* 計(jì)算兩點(diǎn)之間直線與水平線的夾角

*/

function angleBetweenLineAndHorizontal(p1, p2) {

if (new ht.Math.Vector2(p1.x, p1.y).length() > new ht.Math.Vector2(p2.x, p2.y).length()) {

var p = p2;

p2 = p1;

p1 = p;

}

var x1 = p1.x,

y1 = p1.y,

x2 = p2.x,

y2 = p2.y;

var dx = x2 - x1;

var dy = y2 - y1;

var angleRadians = Math.atan2(dy, dx); // 計(jì)算夾角(弧度)

var angleDegrees = angleRadians * (180 / Math.PI); // 弧度轉(zhuǎn)角

// 確保角度在 0 到 360 之間

if (angleDegrees < 0) {

angleDegrees += 360;

}

return angleDegrees;

}

function rotatePointAroundAnotherPoint(point, center, angleDegrees) {

var angleRadians = angleDegrees * (Math.PI / 180);

var cosTheta = Math.cos(angleRadians);

var sinTheta = Math.sin(angleRadians);

var translatedX = point.x - center.x;

var translatedY = point.y - center.y;

var rotatedX = translatedX * cosTheta - translatedY * sinTheta;

var rotatedY = translatedX * sinTheta + translatedY * cosTheta;

var finalX = rotatedX + center.x;

var finalY = rotatedY + center.y;

return { x: finalX, y: finalY };

}

/**

* 給定兩個(gè)點(diǎn),計(jì)算直線的系數(shù) A, B, C

* 直線方程:Ax + By = C

*/

function getLineEquation(x1, y1, x2, y2) {

var A = y2 - y1;

var B = x1 - x2;

var C = A * x1 + B * y1;

return { A, B, C };

}

/**

* 計(jì)算兩條直線的交點(diǎn)

*/

function calculateIntersection(line1, line2) {

var { A: A1, B: B1, C: C1 } = line1;

var { A: A2, B: B2, C: C2 } = line2;

var determinant = A1 * B2 - A2 * B1;

if (determinant === 0) {

// 平行或重合

return null;

} else {

var x = (C1 * B2 - C2 * B1) / determinant;

var y = (A1 * C2 - A2 * C1) / determinant;

return { x, y };

}

}

/**

* 找到兩條線的交點(diǎn),或者延長線的交點(diǎn)

*/

function findIntersection(line1Points, line2Points) {

var [p1, p2] = line1Points;

var [p3, p4] = line2Points;

var line1 = getLineEquation(p1.x, p1.y, p2.x, p2.y);

var line2 = getLineEquation(p3.x, p3.y, p4.x, p4.y);

var intersection = calculateIntersection(line1, line2);

return intersection;

}

實(shí)現(xiàn)的最終效果如下:

圖撲軟件 HT 自定義連線功能為圖形交互設(shè)計(jì)開辟了廣闊的新天地。從基本的"橫-豎-橫"連線到復(fù)雜的總線拓?fù)鋱D,不僅提升了數(shù)據(jù)可視化的靈活性,還大幅增強(qiáng)了用戶體驗(yàn)。通過精細(xì)調(diào)整連線的旋轉(zhuǎn)角度和投影點(diǎn),在 2.5D 效果中呈現(xiàn)更加美觀和直觀的拓?fù)潢P(guān)系。

不僅適用于網(wǎng)絡(luò)結(jié)構(gòu)的展示,還可擴(kuò)展到各種復(fù)雜系統(tǒng)的可視化中。為設(shè)計(jì)師和開發(fā)者提供了強(qiáng)大的工具,幫助他們創(chuàng)造出更加豐富、富有表現(xiàn)力的圖形界面。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 拓?fù)鋱D
    +關(guān)注

    關(guān)注

    1

    文章

    20

    瀏覽量

    14598
  • 數(shù)據(jù)可視化

    關(guān)注

    0

    文章

    473

    瀏覽量

    10494
收藏 0人收藏

    評論

    相關(guān)推薦

    VirtualLab Fusion中的可視化設(shè)置

    摘要 VirtualLab Fusion中的全局選項(xiàng)對話框可以輕松定制軟件的外觀和感覺。還可以保存和加載全局選項(xiàng)文件,以便可以輕松地將偏好設(shè)置從一個(gè)設(shè)備轉(zhuǎn)移到另一個(gè)設(shè)備。本文檔說明了與可視化和結(jié)果
    發(fā)表于 02-25 08:51

    VirtualLab Fusion應(yīng)用:光波導(dǎo)k域布局可視化(“神奇的圓環(huán)”)

    特定光波導(dǎo)布局的光導(dǎo)和耦合條件。 概念 方向轉(zhuǎn)換器計(jì)算器 可以通過“開始”>“計(jì)算器”找到方向轉(zhuǎn)換器計(jì)算器,這有助于演示指定角度的不同方式。 k域可視化 k域可視化:平面波的傳播
    發(fā)表于 02-21 08:53

    七款經(jīng)久不衰的數(shù)據(jù)可視化工具!

    數(shù)據(jù)量的激增,單純通過數(shù)字和文本來分析數(shù)據(jù)已不再高效。數(shù)據(jù)可視化則提供了一種直觀、互動(dòng)性強(qiáng)的方式,幫助人們通過視覺元素,如柱狀、折線圖、餅、熱力圖等圖表形式,理解復(fù)雜的數(shù)據(jù)關(guān)系。 二、數(shù)據(jù)
    發(fā)表于 01-19 15:24

    智慧能源可視化監(jiān)管平臺——助力可視化能源數(shù)據(jù)管理

    博達(dá)可視化大屏設(shè)計(jì)平臺在智慧能源領(lǐng)域的價(jià)值體現(xiàn)在實(shí)時(shí)監(jiān)控、數(shù)據(jù)可視化、決策支持和效率提升等方面。借助該平臺,企業(yè)可以輕松搭建智慧能源類可視化大屏,更加精確和高效地管理生產(chǎn)和生活,實(shí)現(xiàn)
    的頭像 發(fā)表于 11-29 10:00 ?581次閱讀
    智慧能源<b class='flag-5'>可視化</b>監(jiān)管平臺——助力<b class='flag-5'>可視化</b>能源數(shù)據(jù)管理

    HT for Web并力ARMxy工業(yè)計(jì)算機(jī)實(shí)現(xiàn)數(shù)字轉(zhuǎn)型可視化解決方案

    數(shù)字轉(zhuǎn)型作為制造企業(yè)轉(zhuǎn)型的關(guān)鍵過程,正迅速改變傳統(tǒng)的工業(yè)運(yùn)營模式。HT for Web與ARMxy工業(yè)計(jì)算機(jī)的結(jié)合,為數(shù)字轉(zhuǎn)型提供了一個(gè)高度集成的可視化平臺。通過
    的頭像 發(fā)表于 08-28 16:17 ?562次閱讀
    <b class='flag-5'>HT</b> for Web并力ARMxy工業(yè)計(jì)算機(jī)<b class='flag-5'>實(shí)現(xiàn)</b>數(shù)字<b class='flag-5'>化</b>轉(zhuǎn)型<b class='flag-5'>可視化</b>解決方案

    工業(yè)數(shù)據(jù)可視化管理平臺是什么

    數(shù)據(jù)可視化管理平臺應(yīng)運(yùn)而生,它以其獨(dú)特的功能和優(yōu)勢,正在成為工業(yè)數(shù)字轉(zhuǎn)型的重要工具。 工業(yè)數(shù)據(jù)可視化管理平臺的定義 工業(yè)數(shù)據(jù)可視化管理平臺是一種集成了數(shù)據(jù)采集、處理、分析和展示功能的
    的頭像 發(fā)表于 08-28 14:21 ?405次閱讀

    基于 HT for Web 插件搭建組態(tài)拓?fù)?/b>結(jié)構(gòu)

    由于這些拓?fù)鋱D通常極為復(fù)雜,傳統(tǒng)的手動(dòng)布局方式不僅繁瑣且耗時(shí)。鑒于此,軟件自研 HT for Web 產(chǎn)品(以下簡稱為 HT)推出了自動(dòng)
    的頭像 發(fā)表于 08-01 11:20 ?598次閱讀
    基于 <b class='flag-5'>HT</b> for Web 插件搭建組態(tài)<b class='flag-5'>拓?fù)?/b>結(jié)構(gòu)

    基于 HT for Web 實(shí)現(xiàn)拓?fù)?/b>關(guān)系

    拓?fù)?/b>結(jié)構(gòu)在計(jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)和通信領(lǐng)域中非常重要,因?yàn)樗枋隽司W(wǎng)絡(luò)中的設(shè)備(即“點(diǎn)”)如何相互連接(即通過“線”)。這種結(jié)構(gòu)不僅涉及物理布局,即物理拓?fù)?/b>,還可以涉及邏輯或虛擬的連接方式,即邏輯拓?fù)?/b>。
    的頭像 發(fā)表于 06-24 14:09 ?648次閱讀
    基于<b class='flag-5'>圖</b><b class='flag-5'>撲</b> <b class='flag-5'>HT</b> for Web <b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>拓?fù)?/b>關(guān)系<b class='flag-5'>圖</b>

    如何實(shí)現(xiàn)園區(qū)大屏可視化?

    孿生可視化 構(gòu)建平臺利用Web三維可視化技術(shù)對現(xiàn)實(shí)場景進(jìn)行仿真,實(shí)現(xiàn)園區(qū)級業(yè)務(wù)場景 的可視化呈現(xiàn),助力企業(yè)快速完成項(xiàng)目的實(shí)施。實(shí)現(xiàn)園區(qū)場景立
    的頭像 發(fā)表于 06-19 15:39 ?557次閱讀
    如何<b class='flag-5'>實(shí)現(xiàn)</b>園區(qū)大屏<b class='flag-5'>可視化</b>?

    態(tài)勢數(shù)據(jù)可視化技術(shù)有哪些

    的一些主要類型及特點(diǎn): 智慧華盛恒輝網(wǎng)絡(luò)安全態(tài)勢指標(biāo)可視化分析系統(tǒng): 基于地理信息系統(tǒng)、網(wǎng)絡(luò)拓?fù)鋱D、攻擊路徑等的安全態(tài)勢可視化分析系統(tǒng)方法。 通過可視化技術(shù)將安全態(tài)勢數(shù)據(jù)以多視圖、多角
    的頭像 發(fā)表于 06-11 15:47 ?459次閱讀

    智慧大屏是如何實(shí)現(xiàn)數(shù)據(jù)可視化的?

    智慧大屏,作為數(shù)據(jù)可視化的重要載體,已在城市管理、交通監(jiān)控、商業(yè)運(yùn)營等領(lǐng)域廣泛應(yīng)用。本文旨在闡述智慧大屏實(shí)現(xiàn)數(shù)據(jù)可視化的關(guān)鍵技術(shù)和方法,包括數(shù)據(jù)源管理、數(shù)據(jù)處理、視覺編碼、用戶界面與交互設(shè)計(jì)等。
    的頭像 發(fā)表于 06-04 15:02 ?743次閱讀
    智慧大屏是如何<b class='flag-5'>實(shí)現(xiàn)</b>數(shù)據(jù)<b class='flag-5'>可視化</b>的?

    態(tài)勢數(shù)據(jù)可視化技術(shù)有哪些

    確,計(jì)算方法不實(shí)用,可視化效果不直觀等技術(shù)問題,設(shè)計(jì)并實(shí)現(xiàn)了基于地理信息系統(tǒng),網(wǎng)絡(luò)拓?fù)鋱D,攻擊路徑等的安全態(tài)勢可視化分析系統(tǒng)方法, 通過可視化
    的頭像 發(fā)表于 04-22 15:17 ?512次閱讀

    物聯(lián)網(wǎng)可視化監(jiān)控大屏如何實(shí)現(xiàn)?有什么功能?

    在物聯(lián)網(wǎng)飛速發(fā)展的時(shí)代,可視化監(jiān)控大屏成為了眾多企業(yè)和機(jī)構(gòu)實(shí)現(xiàn)智能管理和監(jiān)控的重要工具。它將各種各樣設(shè)備的運(yùn)行狀態(tài)和數(shù)據(jù)以圖形、圖表、動(dòng)畫等形式展示在大屏或其他移動(dòng)設(shè)備上,使得用戶能夠直觀地了解
    的頭像 發(fā)表于 04-11 09:25 ?1076次閱讀

    西門子和英偉達(dá)深化合作,基于生成 AI 實(shí)現(xiàn)實(shí)時(shí)的沉浸可視化

    來源:西門子 ·全新解決方案將西門子 Xcelerator 與英偉達(dá) Omniverse Cloud API 相連接,依托生成 AI 技術(shù),實(shí)現(xiàn)基于物理世界的實(shí)時(shí)可視化 ·在英偉達(dá)年度 GTC
    的頭像 發(fā)表于 03-27 14:57 ?675次閱讀