As an extension and partial answer to my thread I wrote a simple algorithm that given a set of points(with xy coordinates) can form a non self-intersecting polygon.
I had the same problem in javascript and OpenLayers library. So this is my solution for detecting validity of a polygon in 'vectors' layer as a OpenLayers.Layer.Vector:
var ps = vectors.features[0].geometry.getVertices(), i, j, inx, x1, x2, x3, x4, y1, y2, y3, y4, x43, x21, y21, y43, y31, maxx12, maxx34, minx12, minx34;
ps.push(ps[0]);
for(i = 0; i < ps.length -1 ; i++ ) {
x1 = ps[i].x; x2 = ps[i+1].x;
y1 = ps[i].y; y2 = ps[i+1].y;
for(j = i + 2; j < ps.length -1 ; j++ ) {
x3 = ps[j].x; x4 = ps[j+1].x;
y3 = ps[j].y; y4 = ps[j+1].y;
x43 = x4 - x3; x21 = x2 - x1; y21 = y2 - y1; y43 = y4 - y3; y31 = y3 - y1;
inx = ( x43*y21*x1 - x21*y43*x3 + y31*x21*x43 )/( x43*y21 - x21*y43 );
if( x1 < x2 ){
minx12 = x1; maxx12 = x2;
} else {
minx12 = x2; maxx12 = x1;
}
if( x3 < x4 ){
minx34 = x3; maxx34 = x4;
} else {
minx34 = x4; maxx34 = x3;
}
if (minx12 < inx && inx < maxx12 && minx34 < inx && inx < maxx34 ){
console.log('intersected!'+' ,x1: '+x1+' ,x2: '+x2+' ,inx: '+inx+' ,i: '+i+' ,j: '+j);
return;
}
}
}
hope you enjoy it!!