From d04b4f36115e9b4e89b0b6f33c4ae53718d2eb48 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Wed, 17 Feb 2021 21:52:26 +0100 Subject: i&m: add rotation algorithm --- Year_2/IandM/rotation/data/lena.png | Bin 0 -> 473831 bytes Year_2/IandM/rotation/rotation.pde | 75 ++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 Year_2/IandM/rotation/data/lena.png create mode 100644 Year_2/IandM/rotation/rotation.pde (limited to 'Year_2') diff --git a/Year_2/IandM/rotation/data/lena.png b/Year_2/IandM/rotation/data/lena.png new file mode 100644 index 0000000..59ef68a Binary files /dev/null and b/Year_2/IandM/rotation/data/lena.png differ diff --git a/Year_2/IandM/rotation/rotation.pde b/Year_2/IandM/rotation/rotation.pde new file mode 100644 index 0000000..33f79ad --- /dev/null +++ b/Year_2/IandM/rotation/rotation.pde @@ -0,0 +1,75 @@ +void setup() { + size(768, 256); + PImage img = loadImage("lena.png"); + img.resize(256, 256); + img.filter(GRAY); + + image(img, 0, 0); + image(rotate_forward(img, radians(45)), 256, 0); + + image(inverse_rotate(img, radians(45)), 512, 0); +} + +PImage rotate_forward(PImage I, float theta) { + PImage out = createImage(I.width, I.height, RGB); + + out.loadPixels(); + + for (int i = 0; i < out.pixels.length; ++i) { + out.pixels[i] = color(0); + } + + float x, y; + float u1, v1; + + for (int u = 0; u < I.width; ++u) { + for (int v = 0; v < I.height; ++v) { + u1 = u-I.width/2; + v1 = v-I.height/2; + + x = u1*cos(theta)-v1*sin(theta); + y = u1*sin(theta)+v1*cos(theta); + + x+=I.width/2; + y+=I.height/2; + + out.set(round(x), round(y), I.get(u, v)); + } + } + + out.updatePixels(); + + return out; +} + +PImage inverse_rotate(PImage I, float theta) { + PImage out = createImage(I.width, I.height, RGB); + + out.loadPixels(); + + for (int i = 0; i < out.pixels.length; ++i) { + out.pixels[i] = color(0); + } + + float u, v; + float x1, y1; + + for (int x = 0; x < I.width; ++x) { + for (int y = 0; y < I.height; ++y) { + x1 = x-I.width/2; + y1 = y-I.height/2; + + u = x1*cos(theta)+y1*sin(theta); + v = -x1*sin(theta)+y1*cos(theta); + + u+=I.width/2; + v+=I.height/2; + + out.set(x, y, I.get(round(u), round(v))); + } + } + + out.updatePixels(); + + return out; +} -- cgit v1.2.3-18-g5258