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.
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)
}
}
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;
}
}
- 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.
- 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