亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有折線圖的虛擬測量設備

具有折線圖的虛擬測量設備

開滿天機 2022-10-27 16:31:14
我正在使用 LightningChart JS 并想實現一個虛擬測量設備,我可以在其中單擊 A 點,然后拖動到 B 點并獲取 A 點和 B 點的 x、y 值。據我研究事件處理程序,它們只返回一個鼠標事件,其中包含屏幕位置的開始和停止位置。如果我錯了,請糾正我。還請提出一種有效的方法來做到這一點。提前致謝。
查看完整描述

1 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

鼠標事件在與普通 JS 鼠標事件相同的坐標空間中返回鼠標坐標。要在系列坐標空間中獲取點擊位置,需要采取幾個步驟。

首先需要將鼠標坐標轉換為引擎坐標空間。引擎坐標空間是畫布左下角為0,0的畫布區域。這可以通過chart.engine.clientLocation2Engine(ev.clientX,ev.clientY). 這將使用圖表引擎比例返回引擎坐標空間中的事件坐標。

然后需要將其轉換為系列坐標。這可以通過translatePoint方法來完成。translatePoint可用于在兩個不同比例之間轉換點。LightningChart JS 中的比例基本上是一個坐標空間。

const m = chart.engine.clientLocation2Engine(ev.clientX, ev.clientY)
const translated = translatePoint(m, chart.engine.scale, lineSeries.scale)

現在translated變量包含系列坐標空間中的點擊位置。

請參閱下面的完整代碼片段,您可以在其中拖動系列區域,并在停止拖動時將標記放置到拖動的開始和結束位置。

const {

    lightningChart,

    SolidLine,

    SolidFill,

    ColorRGBA,

    AxisTickStrategies,

    UIOrigins,

    DataPatterns,

    translatePoint,

    ColorHEX

} = lcjs


const chart = lightningChart().ChartXY()


const diesel = [

    { x: 0, y: 1.52 },

    { x: 1, y: 1.52 },

    { x: 2, y: 1.52 },

    { x: 3, y: 1.58 },

    { x: 4, y: 2.00 },

    { x: 5, y: 2.00 },

    { x: 6, y: 2.00 },

    { x: 7, y: 2.00 },

    { x: 8, y: 2.26 },

    { x: 9, y: 1.90 },

    { x: 10, y: 1.90 },

    { x: 11, y: 1.90 },

    { x: 12, y: 1.90 },

    { x: 13, y: 1.60 },

    { x: 14, y: 1.60 },

    { x: 15, y: 1.60 },

    { x: 16, y: 1.00 },

    { x: 17, y: 1.00 },

    { x: 18, y: 1.00 },

    { x: 19, y: 1.74 },

    { x: 20, y: 1.47 },

    { x: 21, y: 1.47 },

    { x: 22, y: 1.47 },

    { x: 23, y: 1.74 },

    { x: 24, y: 1.74 },

    { x: 25, y: 1.74 },

    { x: 27, y: 1.5 },

    { x: 28, y: 1.5 },

    { x: 29, y: 1.5 }

]


const gasoline = [

    { x: 0, y: 1.35 },

    { x: 1, y: 1.35 },

    { x: 2, y: 1.35 },

    { x: 3, y: 1.35 },

    { x: 4, y: 1.90 },

    { x: 5, y: 1.90 },

    { x: 6, y: 1.90 },

    { x: 7, y: 1.92 },

    { x: 8, y: 1.50 },

    { x: 9, y: 1.50 },

    { x: 10, y: 1.3 },

    { x: 11, y: 1.3 },

    { x: 12, y: 1.3 },

    { x: 13, y: 1.3 },

    { x: 14, y: 1.3 },

    { x: 15, y: 1.32 },

    { x: 16, y: 1.40 },

    { x: 17, y: 1.44 },

    { x: 18, y: 1.02 },

    { x: 19, y: 1.02 },

    { x: 20, y: 1.02 },

    { x: 21, y: 1.02 },

    { x: 22, y: 1.02 },

    { x: 23, y: 1.02 },

    { x: 24, y: 1.02 },

    { x: 25, y: 1.02 },

    { x: 27, y: 1.30 },

    { x: 28, y: 1.30 },

    { x: 29, y: 1.30 }

]


const lineSeries = chart.addLineSeries({ dataPattern: DataPatterns.horizontalProgressive })


const lineSeries2 = chart.addLineSeries({ dataPattern: DataPatterns.horizontalProgressive })


lineSeries2.add(diesel.map((point) => ({ x: point.x, y: point.y })))

lineSeries.add(gasoline.map((point) => ({ x: point.x, y: point.y })))



const markerA = chart.addChartMarkerXY()

    .setPointMarker((marker) => marker.setFillStyle((f => f.setColor(ColorHEX('#f00')))))

    .setMouseInteractions(false)

const markerB = chart.addChartMarkerXY()

    .setPointMarker((marker) => marker.setFillStyle((f => f.setColor(ColorHEX('#0f0')))))

    .setMouseInteractions(false)


function getClickInSeriesScale(point, scale) {

    const m = chart.engine.clientLocation2Engine(point.x, point.y)

    return translatePoint(m, chart.engine.scale, scale)

}


chart.onSeriesBackgroundMouseDragStop((obj, ev, b, start) => {

    let pointA = getClickInSeriesScale(start, lineSeries.scale)

    let pointB = getClickInSeriesScale({x:ev.clientX,y:ev.clientY}, lineSeries.scale)


    // move markes to start and end points

    markerA.setPosition(pointA)

    markerB.setPosition(pointB)

})

<script src="https://unpkg.com/@arction/[email protected]/dist/lcjs.iife.js"></script>



查看完整回答
反對 回復 2022-10-27
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號