@bokeh/bokehjs
Version:
Interactive, novel data visualization
66 lines • 2.28 kB
JavaScript
import { Area, AreaView } from "./area";
import * as hittest from "../../core/hittest";
import * as p from "../../core/properties";
import { Selection } from "../selections/selection";
export class HAreaView extends AreaView {
static __name__ = "HAreaView";
_index_data(index) {
const { min, max } = Math;
const { data_size } = this;
for (let i = 0; i < data_size; i++) {
const x1_i = this.x1[i];
const x2_i = this.x2[i];
const y_i = this.y[i];
index.add_rect(min(x1_i, x2_i), y_i, max(x1_i, x2_i), y_i);
}
}
_paint(ctx, _indices, data) {
const { sx1, sx2, sy } = { ...this, ...data };
ctx.beginPath();
for (let i = 0, end = sx1.length; i < end; i++) {
ctx.lineTo(sx1[i], sy[i]);
}
// iterate backwards so that the upper end is below the lower start
for (let i = sx2.length - 1; i >= 0; i--) {
ctx.lineTo(sx2[i], sy[i]);
}
ctx.closePath();
this.visuals.fill.apply(ctx);
this.visuals.hatch.apply(ctx);
}
_hit_point(geometry) {
const L = this.sy.length;
const result = new Selection();
for (let i = 0, end = L - 1; i < end; i++) {
const sx = [this.sx1[i], this.sx1[i + 1], this.sx2[i + 1], this.sx2[i]];
const sy = [this.sy[i], this.sy[i + 1], this.sy[i + 1], this.sy[i]];
if (hittest.point_in_poly(geometry.sx, geometry.sy, sx, sy)) {
result.add_to_selected_glyphs(this.model);
result.view = this;
result.line_indices = [i];
break;
}
}
return result;
}
scenterxy(i) {
const scx = (this.sx1[i] + this.sx2[i]) / 2;
const scy = this.sy[i];
return [scx, scy];
}
}
export class HArea extends Area {
static __name__ = "HArea";
constructor(attrs) {
super(attrs);
}
static {
this.prototype.default_view = HAreaView;
this.define(({}) => ({
x1: [p.XCoordinateSpec, { field: "x1" }],
x2: [p.XCoordinateSpec, { field: "x2" }],
y: [p.YCoordinateSpec, { field: "y" }],
}));
}
}
//# sourceMappingURL=harea.js.map