Exercises Computer Graphics

Session 6 - Texture Mapping Oplossingen

Solutions

Exercises:

Useful Links:

Introduction

Solutions for session 6.

Exercises

Source code for all exercises.

Exercise 1: Triangle Scan-conversion

  // a,b and c are assumed to have increasing y values
  void scanConvertTriangle(Point a, Point b, Point c, color col) {
    stroke(col);
    // calculate slope of ab, bc and ac
    // run / rise because we will iterate over y coordinate
    double dab = (1.0*(b.x-a.x))/(b.y-a.y);
    double dac = (1.0*(c.x-a.x))/(c.y-a.y);
    double dbc = (1.0*(c.x-b.x))/(c.y-b.y);

    double xbegin = a.x;
    double xend = a.x;

    // from a to b
    for (int y = a.y; y < b.y; y++) {
      line((int) xbegin, y, (int) xend, y);
      xbegin += dab;
      xend += dac;
    }

    // reset xbegin explicitly to b.x
    // normally, this is not necessary since the first for-loop
    // has increased xbegin up to b.x, but in the special case
    // that (a.y == b.y) the first for-loop will not be executed,
    // so we must manually set xbegin to b.x for the second for-loop
    xbegin = b.x;

    // from b to c
    for (int y = b.y; y < c.y; y++) {
      line((int) xbegin, y, (int) xend, y);
      xbegin += dbc;
      xend += dac;
    }
  }

Exercise 2: Resizing a Bitmap

    /*
     * simple case of trapezium texture mapping: mapping onto rectangle
     * (i.e. resizing a bitmap) using DDA. Resized rectangle is assumed
     * to be represented by:
     *    (x0, y0)+-------+(x1,y0)
     *            |       |
     *            |       |
     *    (x0, y1)+-------+(x1,y1)
     */
    void resizeBmp(int x0, int y0, int x1, int y1, PImage bmp) {
      int newBmpWidth = x1 - x0;
      int newBmpHeight = y1 - y0;
      double dW = 1.0 * bmp.width / newBmpWidth;
      double dH = 1.0 * bmp.height / newBmpHeight; 
      double u = 0;
      for (int i = x0; i < x1; i++) {
        double v = 0;
        for (int j = y0; j < y1; j++) {
          stroke(bmp.get((int) u, (int) v));
          point(i, j);
          v += dH;
        }
        u += dW;
      }
    }

Exercise 3: Wolfenstein 3D Texture mapping

    /*
     * Assumes trapezium is specified by:
     *   (left, a)+---____
     *            |       ---__+(right, b)
     *            |            |
     *            |            |
     *            |       ___--+(right, c)
     *   (left, d)+___----
     */
    void drawTrapTexture(int left, int right, int a, int b, int c, int d, PImage bmp) {
      double dAB = 1.0 * (b - a) / (right - left);
      double dCD = 1.0 * (c - d) / (right - left);
      double dX =  1.0 * bmp.width / (right - left);
      double ytop = a;
      double ybot = d;
      double x = 0;
      double y;
      for (int i = left; i < right; i++) {
        double dY = 1.0 * bmp.height / (ybot - ytop);
        y = 0;
        for (int j = (int) ytop; j < (int) ybot; j++) {
          stroke(bmp.get((int)x,(int)y));
          point(i,j);
          y += dY;
        }
        ytop += dAB;
        ybot += dCD;
        x += dX;
      }
    }

Exercise 4: Quake Texture mapping

Look at the source code for the definitions of the auxiliary functions.

void drawQuakeTexture(Point p[], Point tmap[], PImage bmp) { int p1, p2, p3, p4; p1 = p3 = firstPoint(p); p2=nextLeft(p,p1); p4=nextRight(p,p3); do { println("drawing from "+p[p1].x+p[p1].y+" "+p[p2].x+p[p2].y+" "+ p[p3].x+p[p3].y+" "+p[p4].x+p[p4].y); drawLineTexture(p[p1], p[p2], p[p3], p[p4], tmap[p1], tmap[p2], tmap[p3], tmap[p4], bmp); if (p[p2].y < p[p4].y) { p1=p2; p2=nextLeft(p,p1); } else { p3=p4; p4=nextRight(p,p3); } } while (p1!=p3); }
Quake Texture Mapping
Valid HTML 4.01 Transitional ©2008-2009 Tom Van Cutsem