class breakScale{
constructor(){
this.linear = d3.scaleLinear();
this.linear_no_breaks = d3.scaleLinear();
}
domain(data, acess_pos, acess_length){
this.breaks = [];
var ind = data.map((d, i) => i);
ind = ind.sort(function(a, b){ return acess_pos(data[a]) - acess_pos(data[b]);});
var start_pos, end_pos, space;
for(let i = 0; i < (data.length - 1); i++){
if(i == 0){
end_pos = acess_pos(data[ind[i]]) + acess_length(data[ind[i]])/2;
}else{
end_pos = d3.max(ind.slice(0, i + 1).map(ii => acess_pos(data[ii]) + acess_length(data[ii])/2));
}
start_pos = acess_pos(data[ind[i+1]]) - acess_length(data[ind[i+1]])/2;
space = start_pos - end_pos;
if(space > 0){
this.breaks.push({start: end_pos, end: start_pos, space: space});
}
}
var minVal = d3.min(data.map(d => acess_pos(d) - acess_length(d)/2));
var maxVal = d3.max(data.map(d => acess_pos(d) + acess_length(d)/2));
this.linear.domain([minVal, maxVal]);
this.linear_no_breaks.domain([minVal, maxVal - this.breaks.map(d => d.space).reduce((a, b) => a + b)]);
}
range(rangeVal){
this.linear.range(rangeVal);
this.linear_no_breaks.range(rangeVal);
}
transform(y){
var y_old = y;
for(let i = 0; i < this.breaks.length; i++){
if(y_old >= this.breaks[i].end){
y = y - this.breaks[i].space;
}
}
return this.linear_no_breaks(y);
}
transform_tick(y){
var i = 0;
while(y > this.breaks[i].start){
y = y + this.breaks[i].space;
i = i + 1;
}
return y;
}
}