blob: c9ebef65e12fcc50be52a47afa76b2f7b7232e47 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {isDimensionStacked} from '../../data/helper/dataStackHelper';
import {isNumber, map} from 'zrender/src/core/util';
import type Polar from '../../coord/polar/Polar';
import type Cartesian2D from '../../coord/cartesian/Cartesian2D';
import SeriesData from '../../data/SeriesData';
import Axis from '../../coord/Axis';
import type { LineSeriesOption } from './LineSeries';
interface CoordInfo {
dataDimsForPoint: string[]
valueStart: number
valueAxisDim: string
baseAxisDim: string
stacked: boolean
valueDim: string
baseDim: string
baseDataOffset: number
stackedOverDimension: string
}
export function prepareDataCoordInfo(
coordSys: Cartesian2D | Polar,
data: SeriesData,
valueOrigin?: LineSeriesOption['areaStyle']['origin']
): CoordInfo {
const baseAxis = coordSys.getBaseAxis();
const valueAxis = coordSys.getOtherAxis(baseAxis as any);
const valueStart = getValueStart(valueAxis, valueOrigin);
const baseAxisDim = baseAxis.dim;
const valueAxisDim = valueAxis.dim;
const valueDim = data.mapDimension(valueAxisDim);
const baseDim = data.mapDimension(baseAxisDim);
const baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;
const dims = map(coordSys.dimensions, function (coordDim) {
return data.mapDimension(coordDim);
});
let stacked = false;
const stackResultDim = data.getCalculationInfo('stackResultDimension');
if (isDimensionStacked(data, dims[0] /*, dims[1]*/)) { // jshint ignore:line
stacked = true;
dims[0] = stackResultDim;
}
if (isDimensionStacked(data, dims[1] /*, dims[0]*/)) { // jshint ignore:line
stacked = true;
dims[1] = stackResultDim;
}
return {
dataDimsForPoint: dims,
valueStart: valueStart,
valueAxisDim: valueAxisDim,
baseAxisDim: baseAxisDim,
stacked: !!stacked,
valueDim: valueDim,
baseDim: baseDim,
baseDataOffset: baseDataOffset,
stackedOverDimension: data.getCalculationInfo('stackedOverDimension')
};
}
function getValueStart(valueAxis: Axis, valueOrigin: LineSeriesOption['areaStyle']['origin']) {
let valueStart = 0;
const extent = valueAxis.scale.getExtent();
if (valueOrigin === 'start') {
valueStart = extent[0];
}
else if (valueOrigin === 'end') {
valueStart = extent[1];
}
// If origin is specified as a number, use it as
// valueStart directly
else if (isNumber(valueOrigin) && !isNaN(valueOrigin)) {
valueStart = valueOrigin;
}
// auto
else {
// Both positive
if (extent[0] > 0) {
valueStart = extent[0];
}
// Both negative
else if (extent[1] < 0) {
valueStart = extent[1];
}
// If is one positive, and one negative, onZero shall be true
}
return valueStart;
}
export function getStackedOnPoint(
dataCoordInfo: CoordInfo,
coordSys: Cartesian2D | Polar,
data: SeriesData,
idx: number
) {
let value = NaN;
if (dataCoordInfo.stacked) {
value = data.get(data.getCalculationInfo('stackedOverDimension'), idx) as number;
}
if (isNaN(value)) {
value = dataCoordInfo.valueStart;
}
const baseDataOffset = dataCoordInfo.baseDataOffset;
const stackedData = [];
stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx);
stackedData[1 - baseDataOffset] = value;
return coordSys.dataToPoint(stackedData);
}