Warning: session_start(): open(/var/lib/php/sessions/sess_jk59jpg9kbh6v0mkhd4ueb0rhs, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
// call clearCache when changing parameters
sclass OCRCompass implements Renderable {
// compass can look for dark or bright lines, set this flag accordingly:
bool brightForeground;
IBWIntegralImage image;
Pt center; // point we're looking at
double radius = 16; // radius of circle
int sensorFootprint = 0; // size of each "pixel" (rectangle) to grab - defaults to radius
int steps = 12; // how many segments of circle (=steps/2 line orientations). should be even
int blur; // blur width
double[] values; // brightnesses at each point (low=foreground)
L sensors;
L sensors() {
if (sensors == null)
sensors = squaresAroundCircle(center, steps, radius, sensorFootprint());
ret sensors;
}
int angles() { ret steps/2; }
int sensorFootprint() {
ret sensorFootprint == 0 ? iceil(radius*12/max(steps, 12)) : sensorFootprint;
}
void compute {
L sensors = sensors();
if (l(values) != angles()) values = new double[angles()];
for i over values: values[i] = avg(
image.getPixelAverage(sensors.get(i)),
image.getPixelAverage(sensors.get(i+angles())));
}
void ensureComputed { if (values == null) compute(); }
double mostLikelyAngle() { ensureComputed();
ret indexOfMinOrMaxEntryInDoubleArray(brightForeground, values)*twoPi()/steps;
}
public void renderOn(Graphics2D g, int w, int h) { ensureComputed();
renderRenderables(g, w, h, zipAndMap(sensors(), repeatList(2, asList(values)),
(r, value) -> BoxWithColor(r, 0, 0, iround(value))));
drawRotatedRoundEdgeLine(g, center, mostLikelyAngle(), radius*1.5, Color.green, radius/3f);
}
void clearCache {
sensors = null;
}
}