Additions:
~- advanced pattern matching: https://www.safaribooksonline.com/library/view/programming-scala-2nd/9781491950135/ch04.html
Additions:
Avvisi -> Annalisa Cirinnà.
Avvisi -> Per gli avvisi riguardanti gli orari delle lezioni e degli esami metti in copia anche Federica Cannelli
Additions:
[[EsercCorso Esercitazioni]]
Deletions:
[[Esercitazioni1617]]
Additions:
[[Esercitazioni1617]]
Additions:
~- https://www.quora.com/How-can-I-learn-to-think-like-a-functional-programmer/answer/Panicz-Godek
Deletions:
Discussions on functional programming:
https://www.quora.com/How-can-I-learn-to-think-like-a-functional-programmer/answer/Panicz-Godek
Additions:
Discussions on functional programming:
https://www.quora.com/How-can-I-learn-to-think-like-a-functional-programmer/answer/Panicz-Godek
Additions:
Per compilare da riga di comando usare: ##""scalac Frame2D.scala Shape.scala Model2D.scala""##.
Deletions:
Per compilare da riga di comando usare: ##scalac Frame2D.scala Shape.scala Model2D.scala##.
Additions:
Per compilare da riga di comando usare: ##scalac Frame2D.scala Shape.scala Model2D.scala##.
Additions:
==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).
List(new Line(0.0,0.0,1.0,1.0)) // esempio di linea
Deletions:
==Esercizio 25: disegno di un Mandala toroidale (grafica 2D)==
>>"""">> Completare il metodo ##get## dell'object ##""ToroidalMandala""## seguente in modo che costruisca un modello 2D del Mandala toroidale a 24 "petali" mostrato in figura. La figura è creata utilizzando esclusivamente cerchi. 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. ##Math.sin##).
**Approfondimento.** I [[http://thes.bncf.firenze.sbn.it/termine.php?id=7159 Mandala]] sono dei disegni di grande suggestione che rivestono un significato spirituale e rituale sia nel Buddhismo che nell'Hinduismo. Il Mandala (dal sanscrito maṇḍala (मण्डल), tradotto come "cerchio") rappresenta, secondo i buddhisti, il processo mediante il quale il cosmo si è formato dal suo centro. Attraverso un articolato simbolismo, il Mandala consente una sorta di viaggio iniziatico che permette di crescere interiormente.
List(new Line(0.0,0.0,1.0,1.0))
Additions:
==Esercizio 25: disegno di un Mandala toroidale (grafica 2D)==
>>"""">> Completare il metodo ##get## dell'object ##""ToroidalMandala""## seguente in modo che costruisca un modello 2D del Mandala toroidale a 24 "petali" mostrato in figura. La figura è creata utilizzando esclusivamente cerchi. 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. ##Math.sin##).
**Approfondimento.** I [[http://thes.bncf.firenze.sbn.it/termine.php?id=7159 Mandala]] sono dei disegni di grande suggestione che rivestono un significato spirituale e rituale sia nel Buddhismo che nell'Hinduismo. Il Mandala (dal sanscrito maṇḍala (मण्डल), tradotto come "cerchio") rappresenta, secondo i buddhisti, il processo mediante il quale il cosmo si è formato dal suo centro. Attraverso un articolato simbolismo, il Mandala consente una sorta di viaggio iniziatico che permette di crescere interiormente.
%%(java;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))
}
def main(args:Array[String]) {
println("Displaying 20x20 grid...")
Frame2D.display(Model2D.getGrid(20), 500, 500)
}
%%(java;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
%%(java;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);
Additions:
~& Suggerimento: utilizzare gli intrinsic ##_mm_loadu_si128## per caricare dati da memoria a registro SSE, ##_mm_max_epu8## per calcolare il massimo di ##unsigned char## e ##_mm_store_si128## per trasferire dati da registro SSE a memoria. Includere ##"smmintrin.h"## e compilare con l'opzione ##-msse4.1##.
Deletions:
~& Suggerimento: utilizzare gli intrinsic ##_mm_loadu_si128## per caricare dati da memoria a registro SSE, ##_mm_max_epu8## per calcolare il massimo di ##unsigned char## e ##_mm_store_si128## per trasferire dati da registro SSE a memoria.
Additions:
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.
~& Suggerimento: utilizzare gli intrinsic ##_mm_loadu_si128## per caricare dati da memoria a registro SSE, ##_mm_max_epu8## per calcolare il massimo di ##unsigned char## e ##_mm_store_si128## per trasferire dati da registro SSE a memoria.
Deletions:
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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di indici (i,j) in B è ottenuto come massimo dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (i,j). Escludere dal calcolo del massimo i pixel che escono dai bordi. Realizzare la funzione usando vettorizzazione SSE.
Additions:
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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di indici (i,j) in B è ottenuto come massimo dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (i,j). 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:
Deletions:
Scrivere una funzione ##void blur(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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di coordinate (x,y) in B è ottenuto come media dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (x,y). Togliere dal calcolo della media i pixel che escono dai bordi. Realizzare la funzione usando vettorizzazione SSE o AVX.
Additions:
#define M(mat,i,j,rows) ((mat)[(i)*(w)+(j)])
#define MIN5 2
#define MAX5 3
unsigned v = M(A,ii,jj,w);
if (v>m) m=x;
Deletions:
unsigned x = M(A,ii,jj,w);
if (x>m) m=x;
Additions:
%%(c)
void pixelize(const unsigned char* A, unsigned char* B, size_t w, size_t h){
int i, j, ii, jj;
for (i=0; i
for (j=0; j
unsigned m = 0;
for (ii=i-MIN5; ii
for (jj=j-MIN5; jj
if (ii<0 || ii>=h || jj<0 || jj>=w) continue;
unsigned x = M(A,ii,jj,w);
if (x>m) m=x;
}
M(B,i,j,w) = m;
}
}
%%
Additions:
Scrivere una funzione ##void blur(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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di coordinate (x,y) in B è ottenuto come media dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (x,y). Togliere dal calcolo della media i pixel che escono dai bordi. Realizzare la funzione usando vettorizzazione SSE o AVX.
Deletions:
Scrivere una funzione ##void blur(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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di coordinate (x,y) in B è ottenuto come media dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (x,y). Togliere dal calcolo della media i pixel che escono dai bordi.
Additions:
Scrivere una funzione ##void blur(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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di coordinate (x,y) in B è ottenuto come media dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (x,y). Togliere dal calcolo della media i pixel che escono dai bordi.
Deletions:
Scrivere una funzione ##void blur(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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di coordinate (x,y) in B è ottenuto come media dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (x,y). Sui bordi, fare la media.
Additions:
==Esercizio 3 (Elaborazione di immagini vettorizzata)==
Scrivere una funzione ##void blur(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, crea un'altra immagine B delle stesse dimensioni e con la stessa rappresentazione dove il pixel di coordinate (x,y) in B è ottenuto come media dei valori dei pixel di A nella finestra di dimensioni 5x5 centrata in (x,y). Sui bordi, fare la media.
Additions:
- installato AMD APP SDK 3.0 ""OpenCL"" (scaricato da http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/):
Deletions:
- installato AMD APP SDK 3.0 OpenCL (scaricato da http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/):