
A set of Roslyn Analyzer aimed to enforce some design good practices and code quality (QA) rules.
https://github.com/DogmaSolutions/Analyzers
Recent commits:
Di seguito sono presenti alcune funzioni di utilità generale che consentono di manipolare stringhe contenenti paths e tokens formattati tramite grammatica CSV
Ritorna il primo token della stringa dato uno splitter
if (!String.prototype.firstToken) {
String.prototype.firstToken = function (splitter) {
var tokens = this.split(splitter);
if (tokens && tokens.length > 0)
return tokens[0];
else
return this;
};
}
Ritorna l’ultimo token della stringa dato uno splitter
if (!String.prototype.lastToken) {
String.prototype.lastToken = function (splitter) {
var tokens = this.split(splitter);
if (tokens && tokens.length > 0)
return tokens[tokens.length - 1];
else
return this;
};
Ritorna tutto il path eccetto l’ultimo token ed il precedente splitter, in poche parole tronca il path a livello dell’lultimo token
if (!String.prototype.allExceptLastTokenAndSplitter) {
String.prototype.allExceptLastTokenAndSplitter = function (splitter) {
var i = this.lastIndexOf(splitter);
if (i >= 0)
return this.substring(0, i);
else
return this;
};
Ritorna tutto il path eccetto l’ultimo token, in poche parole tronca il path a livello dell’ultimo token omettendo anche l’ultimo splitter
if (!String.prototype.allExceptLastToken) {
String.prototype.allExceptLastToken = function (splitter) {
var i = this.lastIndexOf(splitter);
if (i >= 0)
return this.substring(0, i) + splitter;
else
return this;
};
}
Rimpiazza l’ultimo token del path con il token dato
if (!String.prototype.replaceLastToken) {
String.prototype.replaceLastToken = function (splitter, newToken) {
var i = this.lastIndexOf(splitter);
if (i >= 0)
return this.substring(0, i) + splitter + newToken;
else
return this;
};
}
Un semplice script parametrico OpenSCAD in grado di generare un oggetto solido esportabile ed utilizzabile nel proprio sistema CAD per praticare fori idonei a ventole di raffreddamento
A volte capita, durante la progettazione di un dispositivo, di dovere aggiungere allo stesso una o più ventole di raffreddamento. Poiché le ventole devono potere soffiare l’aria da/verso l’ambiente esterno, è necessario praticare dei fori sulla superficie del case che si va a disegnare.
Esistono, di norma, due soluzioni:
Naturalmente, sia per ragioni di costi che di assemblaggio, la soluzione (2) è spesso preferibile. Lo script che segue consente appunto di generare il “negativo” di tali fori/fenditure. Esso costruisce una serie di oggetti solidi di dimensioni e caratteristiche parametriche, che possono essere poi usati per “forare” la superficie del case in questione.
Di seguito un esempio pratico su come utilizzare gli oggetti generati dallo script. Si supponga di dovere praticare dei fori in questo case:

Come prima cosa, è necessario generare gli oggetti con i parametri desiderati

In seguito è sufficiente posizionarli sul case in modo da avere una intersezaione completa con le superfici da forare, e tramite il proprio CAD eseguire una operazione booleana di tipo “difference” o “combine”

L’operazione “difference/combine” va a tagliare la superficie della scocca usando il nostro modello di taglio (in rosso), e come risultato si hanno una serie di oggetti solidi che “tappano” i fori che abbiamo eseguito.

A questo punto è sufficiente rimuovere gli oggetti di foratura e gli eventuali “sfridi” rimanenti dall’operazione “difference/combine”, ed ecco i fori di ventilazione pronti per l’uso.


// How large is the fan rotor ? (mm)
RotorDiameter=38;
// How large should each hole be ? (mm)
HolesDiameter=4;
// How much space should be left between each hole, proportionally to the hole size ?
HolesRingsSpacingFraction = 0.4; // [0.1:4.0]
// The height of the generated solids (mm)
Height = 10;
// The number of faces of each hole outer perimeter
Resoultion=20;// [3:100]
// VARIABLES INITIALIZATION
echo(“RotorDiameter=”,RotorDiameter);
echo(“HolesDiameter=”,HolesDiameter);
echo(“Height=”,Height);
echo(“Resoultion=”,Resoultion);
HolesBoundingBox = HolesDiameter*(1+HolesRingsSpacingFraction);
echo(“HolesBoundingBox=”,HolesBoundingBox);
NumberOfRings = RotorDiameter / HolesBoundingBox;
echo(“NumberOfRings=”,NumberOfRings);
OuterRadius = RotorDiameter/2;
echo(“OuterRadius=”,OuterRadius);
RingRadiusStep = HolesBoundingBox;
echo(“RingRadiusStep=”,RingRadiusStep);
difference()
{
for (i=[0:1:NumberOfRings/2])
{
difference()
{
for(j=[0:360/((i*HolesBoundingBox*6/HolesBoundingBox)):360])
{
translate([sin(j)*(i*HolesBoundingBox),cos(j)*(i*HolesBoundingBox),0])cylinder(h=Height,d=HolesDiameter, center = false, $fn=Resoultion);
}
}
}
}
Come è possibile notare, in testa allo script sono dichiarare le variabili che regolano il funzionamento dello script:
RotorDiameter=38; // il diametro esterno del rotore della ventola
HolesDiameter=5; // il diametro dei fori da praticare
HolesRingsSpacingFraction = 0.4; // lo spazio che separa un foro dall’altro, in proporzione al diametro del foro stesso
Height = 3; // altezza di estrusione della forma
Resoultion=45; // risoluzione del perimetro dei fori. Il numero rappresenta le faccie de cilindri generati
Gli esempi che seguono dimostrano il funzionamento dello script con diversi valori di questi parameri.
Per un esempio “live” di questo script, fare riferimento a
http://www.thingiverse.com/thing:476061
oppure usare direttamente il “customizer” di Thingiverse a questo indirizzo
http://www.thingiverse.com/apps/customizer/run?thing_id=476061
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Multi_Holes_38_1_1_3_45” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Multi_Holes_38_2_05_3_45” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Multi_Holes_38_3_1_10_3” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Multi_Holes_38_4_04_3_45” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Multi_Holes_38_4_05_10_4” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Multi_Holes_38_4_05_10_5” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Multi_Holes_38_4_05_10_6” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Un semplice script parametrico OpenSCAD in grado di generare un oggetto solido esportabile ed utilizzabile nel proprio sistema CAD per praticare fori/anelli concentrici idonei a ventole di raffreddamento
A volte capita, durante la progettazione di un dispositivo, di dovere aggiungere allo stesso una o più ventole di raffreddamento. Poiché le ventole devono potere soffiare l’aria da/verso l’ambiente esterno, è necessario praticare dei fori sulla superficie del case che si va a disegnare. Esistono, di norma, due soluzioni:
Naturalmente, sia per ragioni di costi che di assemblaggio, la soluzione (2) è spesso preferibile. Lo script che segue consente appunto di generare il “negativo” di tali fori/fenditure. Esso costruisce una serie di oggetti solidi di dimensioni e caratteristiche parametriche, che possono essere poi usati per “forare” la superficie del case in questione.
Di seguito un esempio pratico su come utilizzare gli oggetti generati dallo script. Si supponga di dovere praticare dei fori in questo case:

Come prima cosa, è necessario generare gli oggetti con i parametri desiderati:

In seguito è sufficiente posizionarli sul case in modo da avere una intersezaione completa con le superfici da forare, e tramite il proprio CAD eseguire una operazione booleana di tipo “difference” o “combine”

Una volta fatto, è sufficiente rimuovere gli oggetti di foratura e gli eventuali “sfridi” rimanenti dall’operazione “difference”, ed ecco i fori di ventilazione pronti per l’uso.

/* [FAN FEATURES] */
// How large is the fan rotor ? (mm)
OuterDiameter=38;
// How large is the inner part of the fan rotator ? (mm)
InnerDiameter=5;
/* [RINGS] */
// How many concentric rings should be generated ?
NumberOfRings = 3; // [1:20]
// The height of the extruded rings (mm)
Height = 10;
// The number of faces on each ring perimeter
Resoultion=45; // [3:100]
/* [CONNECTORS] */
// With of the solid connectors that keeps the rings attached to the surface (mm)
ConnectorsWidth=2;
// Generate a pair of solid orthogonal connectors ?
AddOrtogonalConnectors=”YES”; // [YES,NO]
// Generate a pair of solid diagonal connectors ?
AddDiagonalConnectors=”YES”; // [YES,NO]
// VARIABLES INITIALIZATION
echo(“OuterDiameter=”,OuterDiameter);
echo(“InnerDiameter=”,InnerDiameter);
echo(“NumberOfRings=”,NumberOfRings);
echo(“Height=”,Height);
echo(“Resoultion=”,Resoultion);
OuterRadius = OuterDiameter/2;
echo(“OuterRadius=”,OuterRadius);
InnerRadius = InnerDiameter/2;
echo(“InnerRadius=”,InnerRadius);
DeltaRadius = OuterRadius-InnerRadius;
echo(“DeltaRadius=”,DeltaRadius);
RingRadiusStep =DeltaRadius/(NumberOfRings*2-1);
echo(“RingRadiusStep=”,RingRadiusStep);
difference()
{
for (i=[0:2:(NumberOfRings*2-1)])
{
echo(i,” – Outer radius=”,OuterRadius-(RingRadiusStep*(i)));
echo(i,” – Inner radius=”,OuterRadius-(RingRadiusStep*(i+1)));
difference()
{
cylinder(h=Height,r=OuterRadius-(RingRadiusStep*(i)), center = true, $fn=Resoultion);
cylinder(h=Height,r=OuterRadius-(RingRadiusStep*(i+1)), center = true, $fn=Resoultion);
}
}
if(AddOrtogonalConnectors==”YES”)
{
cube(size = [OuterDiameter*1.1,ConnectorsWidth,Height], center = true);
cube(size = [ConnectorsWidth,OuterDiameter*1.1,Height], center = true);
}
if(AddDiagonalConnectors==”YES”)
{
rotate([0,0,45])
{
cube(size = [OuterDiameter*1.1,ConnectorsWidth,Height], center = true);
cube(size = [ConnectorsWidth,OuterDiameter*1.1,Height], center = true);
}
}
}
Come è possibile notare, in testa allo script sono dichiarare le variabili che regolano il funzionamento dello script:
Gli esempi che seguono dimostrano il funzionamento dello script con diversi valori di questi parameri.
Per un esempio “live” di questo script, fare riferimento a http://www.thingiverse.com/thing:458670, oppure usare direttamente il “customizer” di Thingiverse a questo indirizzo http://www.thingiverse.com/apps/customizer/run?thing_id=458670
Diametro esterno: 38mm
Diametro interno: 10mm
Numero anelli: 2
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”..Concentric_Holes_38_10_2_2.” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 10mm
Numero anelli: 3
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”.Concentric_Holes_38_10_3_2..” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 10mm
Numero anelli: 3
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”.Concentric_Holes_38_10_3_2_NoDiagonals..” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 10mm
Numero anelli: 3
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”.Concentric_Holes_38_10_3_2_NoOrtho..” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 10mm
Numero anelli: 4
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”.Concentric_Holes_38_10_4_2..” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 10mm
Numero anelli: 5
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”.Concentric_Holes_38_10_5_2..” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 5mm
Numero anelli: 3
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”.Concentric_Holes_38_5_3_2..” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 7mm
Numero anelli: 5
Larghezza supporti a croce: 2mm
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”..Concentric_Holes_38_7_5_2.” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 7mm
Numero anelli: 5
Larghezza supporti a croce: 2mm
Numero faccie: 4
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”..Concentric_Holes_38_5_3_4.” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
Diametro esterno: 38mm
Diametro interno: 7mm
Numero anelli: 5
Larghezza supporti a croce: 2mm
Numero faccie: 6
[canvasio3D width=”600″ height=”600″ border=”1″ borderCol=”#F6F6F6″ dropShadow=”0″ backCol=”#FFFFFF” backImg=”…” mouse=”on” rollMode=”off” rollSpeedH=”0″ rollSpeedV=”0″ objPath=”Concentric_Holes_38_5_3_6…” objScale=”1.5″ objColor=”56000″ lightSet=”4″ reflection=”off” refVal=”5″ objShadow=”off” floor=”off” floorHeight=”42″ lightRotate=”off” Help=”off”] [/canvasio3D]
La funzione “System.String.Format” presente in dotNET è tra le più utili e fondamentali dell’ambiente. Sfortunatamente in Javascript non esiste nulla di simile. Il codice seguente consente di compensare questa lacuna.
if (!String.prototype.format) {
String.prototype.format = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != 'undefined'
? args[number]
: match
;
});
};
}
Dal 2012 mi diletto (sia per motivi strettamente professionali, che per interesse personale) nella costruzione di applicativi e moduli per .NET Microframework, ed in particolare per Gadgeteer. Trovo questa tecnologia molto interessante, e svilupparci sopra è semplice e molto rapido.
Uno dei frutti delle mie sperimentazioni, e il “Horizontal Photointerrupter”, un foto-interrutture basato su una forcella a led IR, posta orizzontalmente rispetto alla basetta. Il tutto è stato realizzato al fine di essere utilizzabile nelle versioni 4.1, 4.2, 4.3 del .NET Microframework, e di seguito potete trovare i sorgenti che controllano l’elettronica del modulo, consentendone l’utilizzo direttamente nel desginer di Visual Studio



La solution allegata contiene, oltre ai 3 progetti che declinano il modulo nelle 3 versioni del framework, anche una piccola applicazione di test.
Questa applicazione consente di accendere/spegnere un led quando la forcella IR viene chiusa/aperta.
Il codice è molto semplice, ed illustra il modo d’utilizzo di questo componente.

public partial class Program
{
private void ProgramStarted()
{
Debug.Print(“Program Started”);
hpi.InterrupterClosed += hpi_InterrupterClosed;
hpi.InterrupterOpened += hpi_InterrupterOpened;
}
private void hpi_InterrupterOpened(
NJC_HorizontalPhotointerrupter sender,
NJC_HorizontalPhotointerrupter.InterrupterState state)
{
btn.TurnLEDOn();
}
private void hpi_InterrupterClosed(
NJC_HorizontalPhotointerrupter sender,
NJC_HorizontalPhotointerrupter.InterrupterState state)
{
btn.TurnLEDOff();
}
}
Un utile estensione per Visual Studio 2010/2012/2013 in grado di migliorare la leggibilità del codice C# tramite strategie di formattazione e riordinamento
“C# Formatter” è un addin per Visual Studio 2010/2012/2013 che migliora l’esperienza di programmazione in C#, dando la possibilità di pulire il codice e di formattarlo in modo da renderlo più leggibile e compatto.
Ad ora il software è in fase beta, ed è in grado di erogare le seguenti semplici funzioni:
Migliorare la leggibilità del codice, aggiungendo delle righe di separazione tra classi, metodi, proprietà e regioni
Rimuovere l’indentazione delle righe di codice
Rimuovere le righe ridondanti vuote (o composte di soli spazi), rendendo il codice più compatto.
Rimuovere tutte le righe vuote o invisibili dal codice
Rimuovere tutti i commenti dal codice
Rimuovere le indentazioni a sinistra e gli spazi bianchi a destra di ogni riga
Minificare il codice di un file, unificandolo tutto in un’unica riga
Estrarre stringhe dal codice e convertirle in costanti
Versione 1.2
Bugfixes
Aggiunte funzionalità di logging
Versione 1.1
Conversione delle stringhe hard-coded in costanti di classe
Cleanup/beautify di tutto il file corrente con un unico comando
Versione 1.0
Rimozione di tutte le righe vuote o invisibili dal codice
Rimozione di tutti i commenti dal codice
Rimozione delle indentazioni a sinistra e gli spazi bianchi a destra di ogni riga
Minificazione del codice di un file, unificandolo tutto in un’unica riga di codice
Versione 0.9
Rimozione l’indentazione delle righe di codice
Rimozione le righe ridondanti vuote (o composte di soli spazi), rendendo il codice più compatto.
Versione 0.8
Miglioramento della leggibilità del codice, aggiungendo delle righe di separazione tra classi, metodi, proprietà e regioni
Il progetto è scaricabile direttamente dalla Visual Studio Gallery a questo indirizzo:
http://visualstudiogallery.msdn.microsoft.com/0c5664a7-a723-4ac1-9932-d840dfafd6d5
Webbit è il nome di una grande manifestazione di ICT (Information and Communication Technology) che si svolge annualmente con più di 500 workshops e certificazioni. Quest’anno sono stato a Padova con gli amici e collaboratori di GPI (Game Programming Italia) dove abbiamo organizzato 5 differenti workshops incentrati sul game-development. Il mio workshop si è concentrato sui principi dello sviluppo di motori di simulazione fisica 3D a relatime ed è stato incluso nella certificazione “Multimedialità”. Di seguito potete scaricare le slides e le demo che ho illustrato durante la relazione
Vincitore del “GPI Best Tutorial Contest” (GPI), questo progetto spiega approfonditamente l’algoritmo “FRF”, un nuovo sistema che ho implementato per simulare il moto dei fluidi altamente viscosi su vari tipi di superfici.
L’algoritmo FRF si basa sul concetto di “distribuzione di massa ipotetica”, che rende il programma in grado di determinare la forma e la posizione di una massa fluida tridimensionale, calcolando la modifica della sua forma originaria (considerata in una condizione statica di forze) in funzione delle caratteristiche della superficie di scorrimento su cui si muove.
La teoria dietro i concetti specifici e affini è descritta in un tutorial in lingua italiana, ed una traduzione in lingua inglese.
L’algoritmo è implementato in C++ in un contesto di rendering OOP che funziona utilizzando OpenGL per generare l’output visuale in tempo reale (visibile nelle foto di questa pagina).
Tutta l’architettura del sistema è documentata nel linguaggio UML.
https://play.google.com/store/books/details/Federico_Coletto_Real_time_simulation_of_highly_vi?id=UmbeBAAAQBA (ENG)
https://play.google.com/store/books/details/Federico_Coletto_Simulazione_real_time_di_fluidi_a?id=GkfeBAAAQBAJ (ITA)
Tutorial_Fluidi_Viscosi – Federico_Coletto
Real-time simulation of highly-viscous fluids using FRF algorithm
Questo tutorial contiene la documentazione completa in PDF ed il codice sorgente VC6/VC.NET di un progetto che ho scritto qualche tempo fa. Questo programma permette di simulare graficamente le interazioni gravitazionali tra pianeti, stelle, buchi neri, asteroidi e molti altri tipi di corpi celesti. Il suo motore di scripting consente di creare e descrivere il comportamento di sistemi planetari complessi, e visualizzare la simulazione in 3D con OpenGL
Simulazione_Interazioni_Gravitazionali_Tutorial
Simulazione_Interazioni_Gravitazionali_TUT_SRC