Beispiel #1
0
function getTriangles(object) {
	if (object.geometry.type === 'Polygon') {
		var coords = computeWalkableArea(object);
		var perimeter = coords[0];
		var contour = [];
	
		for(j in perimeter) {
			contour.push(new poly2tri.Point(perimeter[j][0], perimeter[j][1]));
		}

		var swctx = new poly2tri.SweepContext(contour);
		
	    for (var i = 1; i < coords.length; i++) { //scorro eventuali holes
		    var perimeter = coords[i];
	        var hole = [];
	        for (j in perimeter) { //scorro le singole coordinate dei vari perimetri
				hole.push(new poly2tri.Point(perimeter[j][0], perimeter[j][1]));
	        }
	        swctx.addHole(hole);
	    }
	    
	    swctx.triangulate();
		var triangles = swctx.getTriangles();
	
		return triangles;
	} 
	else {
		console.log('error, you can triangulate only polygons');
	}
}
const polygonToOBJ = function (geometry, opts) {
	opts.OBJ += `o ${opts.fileName}_object_${opts.count}\n`							
	let   id = 0
	
	const points 	= geometry.coordinates[0].map(
		p => { return {x:p[0], y:p[1]} }
	).filter(
		(it, index, ar) => ar.find( 
				(cur) => (it !== cur) && (cur.x === it.x) && (cur.y === it.y)
			) === undefined
	)

	points.forEach(
		p => p.id = ++id
	)

	const pointsLength = points.length

	poly2tri.noConflict()
	const swctx = new poly2tri.SweepContext(points, {cloneArrays:true})
	try {
		swctx.triangulate()
	} catch (ex) {
		return
	}
	const tris 		= swctx.getTriangles()
	const output 	= argv.xz ? (x,y,z) => `\tv ${x} ${z} ${y}\n` : (x,y,z) => `\tv ${x} ${y} ${z}\n`
	points.forEach(
		p => opts.OBJ += output(p.x * opts.scale, p.y * opts.scale, 0)
	)
	points.forEach(
		p => opts.OBJ += output(p.x * opts.scale, p.y * opts.scale, opts.depth)
	)
		
	const short = (i, p, o) =>tris[i].getPoint(p).id + o
	let 	off = opts.vertexCount

	opts.OBJ += `\tg ${opts.fileName}_bottom_${opts.count}\n`
	for (let i = 0, len = tris.length; i < len; ++i) {
		opts.OBJ += `\tf ${short(i,0,off)} ${short(i,1,off)} ${short(i,2,off)}\n`
	}

	off = opts.vertexCount + pointsLength
	opts.OBJ += `\tg ${opts.fileName}_top_${opts.count}\n`
	for (let i = 0, len = tris.length; i < len; ++i) {
		opts.OBJ += `\tf ${short(i,0,off)} ${short(i,1,off)} ${short(i,2,off)}\n`
	}
	
	opts.OBJ += `\tg ${opts.fileName}_walls_${opts.count}\n`
	opts.OBJ +=  `s 1`
	for (let i = 0; i < pointsLength; ++i) {
		const j = (i + 1) % pointsLength
		const i1 = i + opts.vertexCount + 1
		const i2 = j + opts.vertexCount + 1
		const i3 = i1 + pointsLength
		const i4 = i2  + pointsLength
		opts.OBJ += `\tf ${i1} ${i2} ${i3}\n`
		opts.OBJ += `\tf ${i3} ${i2} ${i4}\n`										
	}
	opts.vertexCount += pointsLength * 2	
}