Skip to content

Instantly share code, notes, and snippets.

View grkvlt's full-sized avatar
💭
🐧

Andrew Donald KENNEDY grkvlt

💭
🐧
View GitHub Profile
@grkvlt
grkvlt / corner.java
Last active October 15, 2017 20:20
Exploring Iterated Function Systems
public static enum Corner {
NW(Cursor.NW_RESIZE_CURSOR, 0, 0),
SW(Cursor.SW_RESIZE_CURSOR, 0, 1),
SE(Cursor.SE_RESIZE_CURSOR, 1, 1),
NE(Cursor.NE_RESIZE_CURSOR, 1, 0);
// ...
}
@grkvlt
grkvlt / context.java
Created October 12, 2017 15:17
Exploring Iterated Function Systems
/** Perform an {@link Consumer action} with a disposable {@link Graphics2D graphics context}. */
public static void context(BiConsumer<Throwable,String> handler,
Graphics graphics, Consumer<Graphics2D> action) {
Graphics2D g = (Graphics2D) graphics.create();
try {
action.accept(g);
} catch (Throwable t) {
handler.accept(t, "Error executing graphics context action");
} finally {
g.dispose();
@grkvlt
grkvlt / spherical.java
Created October 12, 2017 15:16
Exploring Iterated Function Systems
@Override
public Point2D apply(Point2D src) {
double ox = sw / 2d;
double oy = sh / 2d;
double u = Point2D.distance(0d, 0d, ox / 2d, oy / 2d);
double r = Point2D.distance(ox, oy, src.getX(), src.getY()) / u;
double scale = 1d / (r * r);
double x = (src.getX() - ox) / u;
double y = (src.getY() - oy) / u;
@grkvlt
grkvlt / transform.java
Created October 12, 2017 15:15
Exploring Iterated Function Systems
AffineTransform getTransform();
default Point2D apply(Point2D src) {
return getTransform().transform(src, null);
}
@grkvlt
grkvlt / paintgrid.java
Created October 12, 2017 15:13
Exploring Iterated Function Systems
// Transform unit square to view space
double x0 = centre.getX() - (size.getWidth() / 2d / scale);
double y0 = centre.getY() - (size.getHeight() / 2d / scale);
AffineTransform view = AffineTransform.getScaleInstance(scale, scale);
view.translate(-x0, -y0);
// Calculate grid position
double spacing = config.getMaxGrid() / scale;
double mx = centre.getX() - (size.getWidth() / 2d / scale) - (size.getWidth() / 2d);
double my = centre.getY() - (size.getHeight() / 2d / scale) - (size.getHeight() / 2d);
@grkvlt
grkvlt / chooser.java
Created October 12, 2017 15:10
Exploring Iterated Function Systems
chooser.setPreviewPanel(new JPanel());
Arrays.asList(chooser.getChooserPanels()).stream()
.filter(c -> c.getDisplayName().toLowerCase(Locale.ROOT).contains("swatch"))
.findFirst()
.ifPresent(c -> {
chooser.removeChooserPanel(c);
});
@grkvlt
grkvlt / taskenum.java
Created October 12, 2017 15:08
Exploring Iterated Function Systems
public static enum Task { ITERATE, PLOT_DENSITY }
@grkvlt
grkvlt / taskstate.java
Created October 12, 2017 15:07
Exploring Iterated Function Systems
private Multimap<Task, Future<?>> tasks = Multimaps.synchronizedListMultimap(
Multimaps.newListMultimap(Maps.newHashMap(), Lists::newArrayList));
private ConcurrentMap<Future<?>, AtomicBoolean> state = Maps.newConcurrentMap();
@grkvlt
grkvlt / task.java
Created October 12, 2017 15:06
Exploring Iterated Function Systems
public Runnable task(AtomicBoolean cancel, Runnable task) {
return () -> {
while (latch.get()); // Wait until latch released
long initial = token.get();
do {
task.run();
} while (!cancel.get() && token.get() == initial);
};
}
@grkvlt
grkvlt / evaluate.java
Created October 12, 2017 15:05
Exploring Iterated Function Systems
// Evaluate the function twice, first for (x,y) position
// and then for hue/saturation color space
current = points.updateAndGet(0, p -> function.apply(f.apply(p)));
old = points.getAndUpdate(1, p -> function.apply(f.apply(p)));