
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
import { XYCursor } from "../xy/XYCursor";
import { p100 } from "../../core/util/Percent";
import { arc } from "d3-shape";
import * as $math from "../../core/util/Math";
import * as $utils from "../../core/util/Utils";
/**
* Creates a cursor for a [[RadarChart]].
*
* @see {@link https://www.amcharts.com/docs/v5/charts/radar-chart/#Cursor} for more info
*/
export class RadarCursor extends XYCursor {
constructor() {
super(...arguments);
Object.defineProperty(this, "_fillGenerator", {
enumerable: true,
configurable: true,
writable: true,
value: arc()
});
}
_afterNew() {
this._settings.themeTags = $utils.mergeTags(this._settings.themeTags, ["radar", "cursor"]);
super._afterNew();
}
_handleXLine() {
}
_handleYLine() {
}
_getPosition(point) {
const radius = Math.hypot(point.x, point.y);
let angle = $math.normalizeAngle(Math.atan2(point.y, point.x) * $math.DEGREES);
const innerRadius = this.getPrivate("innerRadius");
let startAngle = $math.normalizeAngle(this.getPrivate("startAngle"));
let endAngle = $math.normalizeAngle(this.getPrivate("endAngle"));
if (endAngle < startAngle || endAngle == startAngle) {
if (angle < startAngle) {
angle += 360;
}
endAngle = endAngle + 360;
}
let xPos = (angle - startAngle) / (endAngle - startAngle);
if (xPos < 0) {
xPos = 1 + xPos;
}
if (xPos < 0.003) {
xPos = 0;
}
if (xPos > 0.997) {
xPos = 1;
}
return { x: xPos, y: (radius - innerRadius) / (this.getPrivate("radius") - innerRadius) };
}
_getPoint(positionX, positionY) {
const innerRadius = this.getPrivate("innerRadius");
const startAngle = this.getPrivate("startAngle");
const endAngle = this.getPrivate("endAngle");
const radius = this.getPrivate("radius");
const angle = startAngle + positionX * (endAngle - startAngle);
const r = innerRadius + (radius - innerRadius) * positionY;
return { x: r * $math.cos(angle), y: r * $math.sin(angle) };
}
/**
* @ignore
*/
updateLayout() {
const chart = this.chart;
if (chart) {
const radius = chart.getPrivate("radius", 0);
this.setPrivate("radius", $utils.relativeToValue(this.get("radius", p100), radius));
let innerRadius = $utils.relativeToValue(this.get("innerRadius", chart.getPrivate("innerRadius", 0)), radius);
if (innerRadius < 0) {
innerRadius = radius + innerRadius;
}
this.setPrivate("innerRadius", innerRadius);
let startAngle = this.get("startAngle", chart.get("startAngle", -90));
let endAngle = this.get("endAngle", chart.get("endAngle", 270));
this.setPrivate("startAngle", startAngle);
this.setPrivate("endAngle", endAngle);
}
}
_updateLines(x, y) {
if (!this._tooltipX) {
this._drawXLine(x, y);
}
if (!this._tooltipY) {
this._drawYLine(x, y);
}
}
_drawXLine(x, y) {
const innerRadius = this.getPrivate("innerRadius");
const radius = this.getPrivate("radius");
const angle = Math.atan2(y, x);
this.lineX.set("draw", (display) => {
display.moveTo(innerRadius * Math.cos(angle), innerRadius * Math.sin(angle));
display.lineTo(radius * Math.cos(angle), radius * Math.sin(angle));
});
}
_drawYLine(x, y) {
const positionRadius = Math.hypot(x, y);
this.lineY.set("draw", (display) => {
display.arc(0, 0, positionRadius, this.getPrivate("startAngle", 0) * $math.RADIANS, this.getPrivate("endAngle", 0) * $math.RADIANS);
});
}
_updateXLine(tooltip) {
let point = tooltip.get("pointTo");
if (point) {
point = this._display.toLocal(point);
this._drawXLine(point.x, point.y);
}
}
_updateYLine(tooltip) {
let point = tooltip.get("pointTo");
if (point) {
point = this._display.toLocal(point);
this._drawYLine(point.x, point.y);
}
}
_inPlot(point) {
const chart = this.chart;
if (chart) {
return chart.inPlot(point, this.getPrivate("radius"), this.getPrivate("innerRadius"));
}
return false;
}
_updateSelection(point) {
this.selection.set("draw", (display) => {
const behavior = this.get("behavior");
const downPoint = this._downPoint;
const cursorStartAngle = this.getPrivate("startAngle");
const cursorEndAngle = this.getPrivate("endAngle");
let cursorRadius = this.getPrivate("radius");
let cursorInnerRadius = this.getPrivate("innerRadius");
if (cursorRadius < cursorInnerRadius) {
[cursorRadius, cursorInnerRadius] = [cursorInnerRadius, cursorRadius];
}
let startAngle = cursorStartAngle;
let endAngle = cursorEndAngle;
let radius = cursorRadius;
let innerRadius = cursorInnerRadius;
if (downPoint) {
if (behavior == "zoomXY" || behavior == "selectXY") {
startAngle = Math.atan2(downPoint.y, downPoint.x) * $math.DEGREES;
endAngle = Math.atan2(point.y, point.x) * $math.DEGREES;
innerRadius = Math.hypot(downPoint.x, downPoint.y);
radius = Math.hypot(point.x, point.y);
}
else if (behavior == "zoomX" || behavior == "selectX") {
startAngle = Math.atan2(downPoint.y, downPoint.x) * $math.DEGREES;
endAngle = Math.atan2(point.y, point.x) * $math.DEGREES;
}
else if (behavior == "zoomY" || behavior == "selectY") {
innerRadius = Math.hypot(downPoint.x, downPoint.y);
radius = Math.hypot(point.x, point.y);
}
}
innerRadius = $math.fitToRange(innerRadius, cursorInnerRadius, cursorRadius);
radius = $math.fitToRange(radius, cursorInnerRadius, cursorRadius);
startAngle = $math.fitAngleToRange(startAngle, cursorStartAngle, cursorEndAngle);
endAngle = $math.fitAngleToRange(endAngle, cursorStartAngle, cursorEndAngle);
if (startAngle == endAngle) {
endAngle = startAngle + 360;
}
startAngle *= $math.RADIANS;
endAngle *= $math.RADIANS;
this._fillGenerator.context(display);
this._fillGenerator({ innerRadius: innerRadius, outerRadius: radius, startAngle: startAngle + Math.PI / 2, endAngle: endAngle + Math.PI / 2 });
});
}
}
Object.defineProperty(RadarCursor, "className", {
enumerable: true,
configurable: true,
writable: true,
value: "RadarCursor"
});
Object.defineProperty(RadarCursor, "classNames", {
enumerable: true,
configurable: true,
writable: true,
value: XYCursor.classNames.concat([RadarCursor.className])
});
//# sourceMappingURL=RadarCursor.js.map