Programmazione Funzionale e Parallela

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2017-2018

HomePage | Avvisi | Diario lezioni | Materiale didattico | Esami | Forum | Login

Private Sandbox


Avvisi -> Annalisa Cirinnà.
Avvisi -> Per gli avvisi riguardanti gli orari delle lezioni e degli esami metti in copia anche Federica Cannelli

Esercitazioni

Resources on Scala:

Why FP?

Esercizio 25: disegno di una griglia n x n (grafica 2D)

Completare il metodo get dell'object Model2D seguente in modo che costruisca un modello 2D. La figura è creata utilizzando esclusivamente segmenti di linea. La figura deve essere confinata nello spazio quadrato bidimensionale di lato unitario delimitato dall'origine degli assi fino al punto di coordinate (1,1). La figura viene poi scalata automaticamente dal modulo di visualizzazione per occupare la dimensione della finestra. Si ricordi che da Scala è possibile accedere a tutte le funzioni delle librerie Java (es. quelle della classe Math se dovessero servire).

Per compilare da riga di comando usare: scalac Frame2D.scala Shape.scala Model2D.scala.

Model2D.scala
object Model2D {

  def getGrid(n:Int) = {

    // completare costruzione di un modello 2D di una griglia con n linee verticali ed n linee orizzontali
    List(new Line(0.0,0.0,1.0,1.0)) // esempio di linea
  }

  def main(args:Array[String]) {
    println("Displaying 20x20 grid...")
    Frame2D.display(Model2D.getGrid(20), 500, 500)
  }
}


Shape.scala
abstract class Shape
class Circle(val x:Double, val y:Double, val r:Double) extends Shape
class Line(val x1:Double, val y1:Double, val x2:Double, val y2:Double) extends Shape


Frame2D.scala
import java.awt.{EventQueue,Graphics,Graphics2D,Dimension}
import javax.swing.{JFrame,JPanel}

object Frame2D {
  def display(l:List[Shape], width:Int, height:Int) {
    EventQueue.invokeLater(new Runnable() {
      override def run() {
        val ex = new Frame2D(l,width,height)
        ex.setVisible(true)
      }
    })
  }  
}

class Frame2D(l:List[Shape], width:Int, height:Int) extends JFrame {
  class Surface2D extends JPanel {

    def doDrawCircle(c:Circle, g2d:Graphics2D) {
      val xc = (width*(c.x-c.r)).toInt
      val yc = height/2-(height*(c.y-c.r)).toInt
      val wc = (2*width*c.r).toInt
      val hc = (2*height*c.r).toInt
      g2d.drawOval(xc, yc, wc, hc)      
    }

    def doDrawLine(l:Line, g2d:Graphics2D) {
      val x1 = (width*l.x1).toInt
      val y1 = height-(height*l.y1).toInt
      val x2 = (width*l.x2).toInt
      val y2 = height-(height*l.y2).toInt
      g2d.drawLine(x1, y1, x2, y2)      
    }

    def doDrawing(g:Graphics) {
      g match {
        case g2d:Graphics2D =>
          l foreach (_ match {
            case c:Circle => doDrawCircle(c, g2d)
            case l:Line   => doDrawLine(l, g2d)
          })
      }
    }

    override def paintComponent(g:Graphics) {
      super.paintComponent(g);
      doDrawing(g);
    }
  }

  val panel = new Surface2D()
  panel.setPreferredSize(new Dimension(width, height))
  add(panel);
  setTitle("Shapes");
  setResizable(false)
  pack();
  setLocationRelativeTo(null);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}


Esercizio 3 (Elaborazione di immagini vettorizzata)

Scrivere una funzione void pixelize_vect(const unsigned char* A, unsigned char* B, size_t w, size_t h) che, data un'immagine A a toni di grigio rappresentata in formato row-major (cioè le righe appaiono consecutivamente in memoria), crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di coordinate (i,j) in B è ottenuto come massimo dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (i,j), dove i è l'indice di riga e j quello di colonna. Escludere dal calcolo del massimo i pixel che escono dai bordi. Realizzare la funzione usando vettorizzazione SSE.

Si parta dalla seguente funzione che realizza l'operazione in modo sequenziale:

#define M(mat,i,j,rows) ((mat)[(i)*(w)+(j)])
#define MIN5 2
#define MAX5 3

void pixelize(const unsigned char* A, unsigned char* B, size_t w, size_t h){
    int i, j, ii, jj;
    for (i=0; i<h; i++)
        for (j=0; j<w; j++) {
            unsigned m = 0;
            for (ii=i-MIN5; ii<i+MAX5; ii++)
                for (jj=j-MIN5; jj<j+MAX5; jj++) {
                    if (ii<0 || ii>=h || jj<0 || jj>=w) continue;
                    unsigned v = M(A,ii,jj,w);
                    if (v>m) m=x;
                }
            M(B,i,j,w) = m;
        }
}



- installato AMD APP SDK 3.0 OpenCL (scaricato da http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/):
+ sudo ./AMD-APP-SDK-v3.0.130.135-GA-linux64.sh
+ sudo ln -sf /opt/AMDAPPSDK-3.0/include/CL /usr/include
+ sudo ln -sf /opt/AMDAPPSDK-3.0/lib/x86_64/* /usr/lib/
+ sudo ldconfig
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.1557 seconds