Polygon Boundary

One of the many fun things about being in charge of advertising implementations is your boss will say things like, “Hey, I need you to do the design and markup for this ad and only show it to users living in a polygonal region of California. Can you get that up in a couple of hours?”

I assumed this would be readily available with a little googling, but had trouble finding a Javascript cut-and-paste example, so I ended up adapting a point-in-polygon algorithm written in C.

function in_polygon(polygon,point) 
{
	var X = [],
	    Y = [],
	    j=X.length-1,
	    odd=false,
	    x=point[0],
	    y=point[1];
	
	for(i=0; i < polygon.length; i++) {
		X[X.length] = polygon[i][0];
		Y[Y.length] = polygon[i][1];
	}
		

	for (i=0; i < X.length; i++) {
		if(Y[i] < y && Y[j] >= y
		|| Y[j] < y && Y[i] >= y)
			if (X[i]+(y-Y[i])/(Y[j]-Y[i])*(X[j]-X[i]) < x)
				odd=!odd;
		j=i;
	}
	return odd;
}

The original program took two arrays, one of X coordinates and one of Y coordinates, so the first for loop in the function just translates a more human readable set of values into the X and Y arrays used by the algorithm. So you define the inputs like so:

var polygon = [
	[38,-123],
	[38,-121],
	[36,-121],
	[36,-123]
];

var point = [37,-125];

... and feed them into the function to get a boolean answer.

Hope this saves somebody some time.

Tags: , , ,

Leave a Reply