Добавить ось Z справа от рабочей области XY, рисовать засечку (реечку), которая перемещается вверх-вниз вместе со значением tool.z. Высота оси Z равна высоте оси Y (реальные значения координат по Z масштабировать).
На рабочей области XY менять радиус кружочка, изображающего текущее положение рабочего инструмента (когда инструмент едет вверх, кружочек увеличивается, типа приближается к нам).
/**
* Посчитать радиус рабочего блока с учетом его "близости" к - чем выше блок
* по оси z, тем больше радиус.
*
* Вариант с логорифмическим масштабом - чем ниже блок по оси z, тем быстрее
* меняется радиус (приятнее для визуализации работы двумерного плоттера,
* т.к. у него рабочий блок гуляет не по всей оси z, а в меняет два
* положения, оба близкие к поверхности стола).
*
* @return
*/
private int getWorkingBlockLogProjectionRadius(final double z) {
int minRadius = 5;
int maxRadius = 25;
// прибавляем к z единичку, чтобы не уходить в отрицательные значения
return (int) (minRadius + (maxRadius - minRadius) * Math.log(z + 1)
/ Math.log(WORKING_AREA_Z_HEIGHT));
}
Отображать движение по оси Z:
Кружочек масштабировать логорифмическим масштабом, как сделано здесь https://github.com/1i7/rraptor/blob/master/RraptorPult/src/com/rraptor/pult/view/PlotterAreaView.java#L92