JavaScript實(shí)現(xiàn)繪制兩個坐標(biāo)之間的連線
實(shí)現(xiàn)原理
先概括一下大概的實(shí)現(xiàn)原理,分為兩步:
第一步:我們需要在兩個坐標(biāo)連線的中點(diǎn)上創(chuàng)建一條長度和連線長度相等的直線,這條線的中點(diǎn)也在兩個坐標(biāo)連線的中點(diǎn)上。此時效果大概是這樣子:
第二步:在第一步的基礎(chǔ)上,我們再將這條直線順時針旋轉(zhuǎn)圖上紅色虛線標(biāo)出的角度,它就成為了兩個坐標(biāo)之間的連線。
JavaScript實(shí)現(xiàn)步驟
計(jì)算連線的中點(diǎn)坐標(biāo)
const midX = (x1 + x2) / 2; const midY = (y1 + y2) / 2;
計(jì)算連線的長度
下圖中的虛線和兩個坐標(biāo)間的連線正好組成一個三角形,由勾股定理可以計(jì)算出連線的長度:
const a = x2 -x1; const b = y2 - y1; const length = Math.sqrt(a * a + b * b);
計(jì)算需要旋轉(zhuǎn)的角度
由下圖我們可以看出,這條水平的直線需要旋轉(zhuǎn)的角度實(shí)際上就是三角形左側(cè)夾角的角度。
為了方便求這個夾角的角度,我們假設(shè)可以把這個三角形平移到原點(diǎn),變成
這個樣子:
之后,我們就可以利用Math.atan2(y, x)求得這個夾角的角度。這個方法會返回某個坐標(biāo)到原點(diǎn)的連線與x軸正方向之間的弧度。需要注意的是:該方法返回的是弧度, 角度 = (弧度 * 180) / Math.PI
。
const a = x2 -x1; const b = y2 - y1; const c = (180 * Math.atan2(b, a)) / Math.PI;
至此我們得到了連線的中點(diǎn)坐標(biāo)、連線的長度、連線旋轉(zhuǎn)的角度。我們通過固定定位 + top/left
實(shí)現(xiàn)連線的定位、transform: rotate()
實(shí)現(xiàn)連線的旋轉(zhuǎn)。
完整的JavaScript實(shí)現(xiàn)
export const drawLine = (startObj, endObj) => { // 起點(diǎn)坐標(biāo) const startY = startObj.y; const startX = startObj.x; // 終點(diǎn)坐標(biāo) const endY = endObj.y; const endX = endObj.x; // 用勾股定律計(jì)算出斜邊長度及其夾角(即連線的旋轉(zhuǎn)角度) const a = endX - startX; const b = endY - startY; // 計(jì)算連線長度 const length = Math.sqrt(a * a + b * b); // 弧度值轉(zhuǎn)換為角度值 const c = (180 * Math.atan2(b, a)) / Math.PI; // 連線中心坐標(biāo) const midX = (endX + startX) / 2; const midY = (endY + startY) / 2; const deg = c <= -90 ? 360 + c : c; // 負(fù)角轉(zhuǎn)換為正角 return { position: 'fixed', top: `${midY}px`, left: `${midX - length / 2}px`, width: `${length}px`, transform: `rotate(${deg}deg)`, }; };
以上就是JavaScript實(shí)現(xiàn)繪制兩個坐標(biāo)之間的連線的詳細(xì)內(nèi)容,更多關(guān)于JavaScript坐標(biāo)連線的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于Javascript 對象(object)的prototype
Javascript中的每個對象(object)都會有 prototype,下面為大家介紹下其具體的應(yīng)用2014-05-05如何解決前端筆記本屏幕顯示縮放比例125%,150%對頁面布局的影響
如果要完整解決該縮放和布局問題,仍需適配,下面這篇文章主要給大家介紹了關(guān)于如何解決前端筆記本屏幕顯示縮放比例125%,150%對頁面布局的影響,需要的朋友可以參考下2022-11-11webpack進(jìn)階——緩存與獨(dú)立打包的用法
本篇文章主要介紹了webpack進(jìn)階——緩存與獨(dú)立打包的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08JSON 的正確用法探討:Pyhong、MongoDB、JavaScript與Ajax
這篇文章主要介紹了JSON 的正確用法探討:Pyhong、MongoDB、JavaScript與Ajax的相關(guān)資料,具有參考借鑒價值,需要的朋友一起學(xué)習(xí)吧2016-05-05JavaScript Array實(shí)例方法flat的實(shí)現(xiàn)
flat() 方法用于將一個嵌套多層的數(shù)組進(jìn)行扁平,返回新數(shù)組,它不會改變原始數(shù)組, flat 方法在處理多維數(shù)組時非常有用,它可以讓數(shù)組操作變得更加靈活和簡潔,本文給大家介紹了JavaScript Array實(shí)例方法flat的實(shí)現(xiàn),需要的朋友可以參考下2024-03-03JavaScript實(shí)現(xiàn)復(fù)制內(nèi)容到粘貼板代碼
最近做了一個前端項(xiàng)目,其中有需求:通過button直接把input或者textarea里的值復(fù)制到粘貼板里。下面小編給大家分享JavaScript實(shí)現(xiàn)復(fù)制內(nèi)容到粘貼板代碼,需要的朋友參考下2016-03-03JavaScript表單驗(yàn)證實(shí)例之驗(yàn)證表單項(xiàng)是否為空
表單驗(yàn)證幾乎在每個需要注冊或者是登錄的網(wǎng)站都是必不可少,下面通過本篇文章給大家介紹JavaScript表單驗(yàn)證實(shí)例之驗(yàn)證表單項(xiàng)是否為空,涉及到j(luò)s表單驗(yàn)證實(shí)例相關(guān)知識,對js表單驗(yàn)證實(shí)例代碼需要的朋友一起學(xué)習(xí)吧2016-01-01JavaScript實(shí)現(xiàn)鼠標(biāo)拖拽調(diào)整div大小
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)鼠標(biāo)拖拽調(diào)整div大小,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-03-03