<html>
<title>Triangolazione</title>
</head>
<body style="background-color:#000; color:#ccc; font-family:Arial, sans-serif;">
<h1>TRIANGOLAZIONE</h1>
<h2>Disegnare il poligono cliccando sull area gialla e premere il bottone "triangulate"</h2>
<h3>Lo script non lavora con poligoni intrecciati o bucati</h3>
<div><button onclick="triangulate()">triangulate</button> <button onclick="window.location.reload()">clear</button></div><br>
<canvas id="canvas" width="800" height="800" style="border:1px solid #000; background-color:#333;">
Your browser does not support the HTML5 canvas tag.
</canvas>
<div id="text"></div>
<script>
var vert = [];
var good = [];
var bad = [];
var vertSize = 0;
var goodSize = 0;
var badSize = 0;
var str = "";
var canvas;
var ctx;
function init()
{
canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
ctx.font = "20px Arial";
ctx.strokeStyle = "#ff0";
ctx.fillStyle = "#ff0";
}
function L(a)
{
return String.fromCharCode(65 + a);
}
function next(a)
{
if(a == vertSize - 1)
{
return 0;
}
else
{
return a + 1;
}
}
function abs(a)
{
if(a < 0)
{
return -a;
}
else
{
return a;
}
}
function min(a, b)
{
if(a < b)
{
return a;
}
else
{
return b;
}
}
function max(a, b)
{
if(a > b)
{
return a;
}
else
{
return b;
}
}
function checkPointInsideRectangle(px, py, ax, ay, bx, by)
{
var mx = min(ax, bx), Mx = max(ax, bx), my = min(ay, by), My = max(ay, by);
var w = (py >= my && py <= My), h = (px >= mx && px <= Mx);
if(ax == bx)
{
return w;
}
else if(ay == by)
{
return h;
}
else
{
return (w && h);
}
}
function checkIntersection(ax, ay, bx, by, cx, cy, dx, dy)
{
var px, py;
var dt = (ax - bx) * (cy - dy) - (ay - by) * (cx - dx);
if(dt == 0)
{
return false;
}
else
{
px = ((ax*by-ay*bx)*(cx-dx)-(ax-bx)*(cx*dy-cy*dx))/dt;
py = ((ax*by-ay*bx)*(cy-dy)-(ay-by)*(cx*dy-cy*dx))/dt;
return checkPointInsideRectangle(px,py,ax,ay,bx,by) && checkPointInsideRectangle(px,py,cx,cy,dx,dy);
}
}
function testAdjacency(a, b)
{
var h = abs(a - b);
if(h == 1 || h == vertSize - 1)
{
str += L(a) + L(b) + ": adjacent<br>";
return true;
}
else
{
return false;
}
}
function testBad(a, b)
{
var h = false;
var i = 0;
while(!h && i < badSize)
{
if((bad[i * 2] == a && bad[i * 2 + 1] == b) || (bad[i * 2] == b && bad[i * 2 + 1] == a))
{
str += L(a) + L(b) + ": already discarted<br>";
h = true;
}
i++;
}
return h;
}
function testGood(a, b)
{
var h = false;
var i = 0;
while(!h && i < goodSize)
{
if((good[i * 2] == a && good[i * 2 + 1] == b) || (good[i * 2] == b && good[i * 2 + 1] == a))
{
str += L(a) + L(b) + ": already recognized<br>";
h = true;
}
i++;
}
return h;
}
function testBorderIntersection(a, b)
{
var i = 0;
var h = false;
while(!h && i < vertSize)
{
var j = next(i);
if(a != i && a != j && b != i && b != j)
{
if(checkIntersection(vert[a * 2], vert[a * 2 + 1], vert[b * 2], vert[b * 2 + 1], vert[i * 2], vert[i * 2 + 1], vert[j * 2], vert[j * 2 + 1]))
{
bad[badSize * 2] = a;
bad[badSize * 2 + 1] = b;
badSize++;
str += L(a) + L(b) + ": border intersection " + L(i) + L(j) + "<br>";
h = true;
}
}
i++;
}
return h;
}
function testDiagonalIntersection(a, b)
{
var i = 0;
var h = false;
while(!h && i < goodSize)
{
var c = good[i * 2], d = good[i * 2 + 1];
if(a != c && a != d && b != c && b != d)
{
if(checkIntersection(vert[a * 2], vert[a * 2 + 1], vert[b * 2], vert[b * 2 + 1], vert[c * 2], vert[c * 2 + 1], vert[d * 2], vert[d * 2 + 1]))
{
str += L(a) + L(b) + ": diagonal intersection " + L(c) + L(d) + "<br>";
h = true;
}
}
i++;
}
return h;
}
function testConcavity(a, b)
{
var mx = (vert[a * 2] + vert[b * 2]) / 2, my = (vert[a * 2 + 1] + vert[b * 2 + 1]) / 2;
var h = 0;
var i;
for(i = 0; i < vertSize - 1; i++)
{
if(checkIntersection(mx, my, mx + 10000, my, vert[i * 2], vert[i * 2 + 1], vert[i * 2 + 2], vert[i * 2 + 3]))
{
h++;
}
}
if(checkIntersection(mx, my, mx + 10000, my, vert[i * 2], vert[i * 2 + 1], vert[0], vert[1]))
{
h++;
}
for(i = 0; i < vertSize; i++)
{
if(my == vert[i * 2 + 1])
{
h--;
}
}
if(h % 2 == 0)
{
bad[badSize * 2] = a;
bad[badSize * 2 + 1] = b;
badSize++;
str += L(a) + L(b) + ": concavity<br>";
return true;
}
else
{
return false;
}
}
function check(a, b)
{
if(!testAdjacency(a, b))
{
if(!testBad(a, b))
{
if(!testGood(a, b))
{
if(!testBorderIntersection(a, b))
{
if(!testDiagonalIntersection(a, b))
{
if(!testConcavity(a, b))
{
good[goodSize * 2] = a;
good[goodSize * 2 + 1] = b;
goodSize++;
str += L(a) + L(b) + ": ok<br>";
}
}
}
}
}
}
}
function draw1()
{
ctx.beginPath();
ctx.moveTo(vert[0], vert[1]);
ctx.fillText("A", vert[0], vert[1]);
for(var i = 1; i < vertSize; i++)
{
ctx.lineTo(vert[i * 2], vert[i * 2 + 1]);
ctx.fillText(L(i), vert[i * 2], vert[i * 2 + 1]);
}
ctx.lineTo(vert[0], vert[1]);
ctx.stroke();
}
function draw2()
{
ctx.beginPath();
for(var i = 0; i < goodSize; i++)
{
ctx.moveTo(vert[good[i * 2] * 2], vert[good[i * 2] * 2 + 1]);
ctx.lineTo(vert[good[i * 2 + 1] * 2], vert[good[i * 2 + 1] * 2 + 1]);
}
ctx.stroke();
}
function clr()
{
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
function triangulate()
{
for(var j = 0; j < vertSize && goodSize < vertSize - 3; j++)
{
for(var k = 0; k < vertSize && goodSize < vertSize - 3; k++)
{
if(j != k)
{
check(j, k);
}
}
}
draw2();
document.getElementById("text").innerHTML = str;
}
function main()
{
clr();
canvas.addEventListener("click", function(event)
{
var x = event.pageX - canvas.offsetLeft, y = event.pageY - canvas.offsetTop;
vert.push(x,y);
vertSize++;
clr();
draw1();
});
}
init();
main();
</script>
</body>
</html>
Mi chiamo Cosimo Saccone e sono un programmatore napoletano di 44 anni con oltre 35 anni di esperienza nella programmazione (BASIC, Assembly). Realizzo progetti e programmi utilizzando i principali e più diffusi linguaggi (C, C++, PHP, Javascript, HTML) e software per la grafica (Photoshop, Illustrator, 3dsMax). Anche se la grafica rappresenta il mio principale settore di interesse, non disdegno il lavoro di back-end e di organizzazione dati e sono attento agli aspetti di efficienza e di risparmio delle risorse tipica della programmazione di basso livello (specie nel settore della grafica 3d). Realizzo siti internet, applicativi desktop e servizi di vario tipo. Ho una buona conoscenza della libreria OpenGL per lo sviluppo di applicazioni 3d interattive in C/C++. Cerco di adottare uno stile di programmazione fortemente ordinato e modulare. Possiedo, inoltre, una buona capacità di elaborazione della documentazione. Ho vari hobbies tra cui la pittura, la ginnastica e le lunghe passeggiate in solitudine.
Al fine di migliorare l’esperienza di navigazione sul nostro sito noi di cosimosaccone.com e i nostri partner selezionati elaboriamo i dati personali, compreso l’indirizzo IP e le pagine visitate, in relazione alla tua navigazione nei contenuti del sito, per i seguenti scopi:
Accesso alle informazioni
Dati precisi di geolocalizzazione
Misurazione del pubblico
Pubblicità e contenuti personalizzati
Ti ricordiamo che il termine cookie si riferisce a una porzione di dati inviati al tuo browser da un web server. Il cookie viene memorizzato sul tuo dispositivo e riconosciuto dal sito web che lo ha inviato in ogni navigazione successiva. Se vuoi saperne di più e compiere una scelta diversa, come il rifiuto del trattamento dei tuoi dati personali, clicca qui sulla nostra privacy policy. Potrai sempre modificare le tue scelte e impostare i singolo cookies selezionando il bottone qui sotto.
OK