キー | 画像 | 意味 | 特徴 |
---|---|---|---|
0 | 元.jpg | 元画像 | |
1 | 1選択範囲.jpg | Processingの実行画面のスクリーンショット | 元画像にクリック時の赤枠・青枠がついたもの |
2 | 2描画機能X.jpg | Processingの描画機能で赤枠の範囲を画面のサイズに変形させた画像 | なめらかに拡大される 上側が左、下側が右に動いたように歪む |
3 | 2描画機能Y.jpg | Processingの描画機能で青枠の範囲を画面のサイズに変形させた画像 | なめらかに拡大される 左側が上、右側が下に動いたように歪む |
4 | 3最近傍補間X.jpg | 最近傍補間を使って赤枠の範囲を画面のサイズに変形させた画像 | 元の1ピクセルがそのまま拡大されたような粗いドットが見える 上側が左、下側が右に動いたように歪む |
5 | 3最近傍補間Y.jpg | 最近傍補間を使って青枠の範囲を画面のサイズに変形させた画像 | 元の1ピクセルがそのまま拡大されたような粗いドットが見える 左側が上、右側が下に動いたように歪む |
6 | 3双一次補間X.jpg | 双一次補間を使って赤枠の範囲を画面のサイズにに変形させた画像 | なめらかに拡大される 上側が左、下側が右に動いたように歪む |
7 | 3双一次補間Y.jpg | 双一次補間を使って青枠の範囲を画面のサイズにに変形させた画像 | なめらかに拡大される 左側が上、右側が下に動いたように歪む |
if (created) return; // 画像作成後なら何もしない
PImage[] img = new PImage[5]; // 出力ファイル名 String[] fName = {"元", "1選択範囲", "2描画機能", "3最近傍補間", "3双一次補間"};
PImage[] img = new PImage[8]; // 出力ファイル名 String[] fName = {"元", "1選択範囲", "2描画機能X", "2描画機能Y", "3最近傍補間X", "3最近傍補間Y", "3双一次補間X", "3双一次補間Y"};
float a = PI/6; // 選択範囲の傾き(30°)
float a = radians(20); // 選択範囲の傾き(20°)
// 1~4番を元画像と同じサイズの黒画像にする for (int i=1; i<=4; i++) {
// 1~7番を元画像と同じ画像にする for (int i=1; i<=7; i++) {
rotate(-a); // 座標系を-aだけ回転
shearX(-a); // 座標系を横に-aだけスキュー
shearX(-a); // 座標系を横に-aだけスキュー
shearY(-a); // 座標系を縦に-aだけスキュー
stroke(255, 0, 0); // 図形の枠の色を赤にする
stroke(0, 0, 255); // 図形の枠の色を青にする
drawToImage(s, a, 2); // 描画機能でs倍に拡大、aだけ回転した画像をimg[2]に保存
drawToImage(s, a, 2, "X"); // 描画機能でs倍に拡大、aだけX方向にスキューした画像をimg[2]に保存 drawToImage(s, a, 3, "Y"); // 描画機能でs倍に拡大、aだけY方向にスキューした画像をimg[3]に保存
nearestNeighbor(s, a, 3); // 最近傍補間でs倍に拡大、aだけ回転した画像をimg[3]に保存 bilinear(s, a, 4); // 双一次補間でs倍に拡大、aだけ回転した画像をimg[4]に保存
void drawToImage(float s, float a, int n) {
void drawToImage(float s, float a, int n, String direction) {
pg.rotate(a); // (pg)aだけ回転
if (direction == "X") { pg.shearX(a); // (pg)X方向にaだけスキュー } else { pg.shearY(a); // (pg)Y方向にaだけスキュー }
void nearestNeighbor(float s, float a, int n) {
void nearestNeighbor(float s, float a, int n, String direction) {
void bilinear(float s, float a, int n) {
void bilinear(float s, float a, int n, String direction) {
// cを中心として画像を1/s倍して-a回転させたときのベクトルfの移動先のベクトルを返す(課題3で使用) PVector getScaledPosition(PVector c, PVector f, float s, float a) {
// cを中心として画像を1/s倍して-aスキューさせたときのベクトルfの移動先のベクトルを返す(課題3で使用) PVector getScaledPosition(PVector c, PVector f, float s, float a, String direction) {
f.rotate(-a); // fを-a回転させる
if (direction == "X"){ f.x -= f.y * tan(a); } else { f.y -= f.x * tan(a); }
// nearestNeighbor(s, a, 3); // 最近傍補間でs倍に拡大、aだけ回転した画像をimg[3]に保存 // bilinear(s, a, 4); // 双一次補間でs倍に拡大、aだけ回転した画像をimg[4]に保存
nearestNeighbor(s, a, 4, "X"); // 最近傍補間でs倍に拡大、aだけX方向にスキューした画像をimg[4]に保存 nearestNeighbor(s, a, 5, "Y"); // 最近傍補間でs倍に拡大、aだけY方向にスキューした画像をimg[5]に保存 bilinear(s, a, 6, "X"); // 双一次補間でs倍に拡大、aだけX方向にスキューした画像をimg[6]に保存 bilinear(s, a, 7, "Y"); // 双一次補間でs倍に拡大、aだけY方向にスキューした画像をimg[7]に保存
PVector pos = getScaledPosition(new PVector(cx-0.5, cy-0.5), new PVector(i, j), s, a);
PVector pos = getScaledPosition(new PVector(cx-0.5, cy-0.5), new PVector(i, j), s, a, direction);
if (k>=0 && k<=4) {
if (k>=0 && k<=7) {