rendered paste body#! /usr/bin/env python# -*- coding: utf-8 -*-import sysfrom scitools.std import *from operator import itemgetterfrom numpy.linalg import det, normif __name__ == '__main__': # try: # filename = sys.argv[1] # f = open(filename) # except IndexError: # print "Usage : tp2.py filename" # sys.exit() # except IOError: # print "Could not open file '%s'" % filename # sys.exit() f = open('./data/pts5.txt') ff = [] for line in f: ff.append(line.split()) #ff = f.readlines() print '-----------' print ff def to_point(): return lambda e : [float(itemgetter(0)(e)), float(itemgetter(1)(e))] def to_triangle(): return lambda e : sort([int(itemgetter(0)(e)) - 1, int(itemgetter(1)(e)) - 1, int(itemgetter(2)(e)) - 1]) print '-----------' np = int(ff[0][0]) print np vertices = array(map(to_point(), ff[1:np + 1])) print vertices print vertices.shape print '-----------' nt = int(ff[np+1][0]) print nt print ff[7:9] tgls = array(map(to_triangle(), ff[np + 2:np + nt + 2])) print tgls print tgls.shape print '-----------' print vertices[:, 0] # plot(vertices[:, 0], vertices[:, 1], 'ro-', # axis = [min(vertices[:, 0]) - 0.5, max(vertices[:, 0]) + 0.5, # min(vertices[:, 1]) - 0.5, max(vertices[:, 1]) + 0.5]) # Nombre de demi-arrêtes ne = 3 * nt # Nombre de faces nf = np + 1 print '-----' edges = zeros((ne, 5), uint8) print edges.shape opp = {} ii = 0 for i in range(nt): v0, v1, v2 = tgls[i, :] # Ordre polaire u = vertices[v2] - vertices[v0] v = vertices[v1] - vertices[v0] d = det((u, v)) # v2 < v1 if d > 0 or d == 0 and norm(u) >= norm(v): tmp = v1 v1 = v2 v2 = tmp # Demi-arrête suivante edges[ii, 0] = ii + 1 edges[ii + 1, 0] = ii + 2 edges[ii + 2, 0] = ii # Demi-arrête précédente edges[ii, 1] = ii + 2 edges[ii + 1, 1] = ii edges[ii + 2, 1] = ii + 1 # Sommets d'origine edges[ii, 3] = v0 edges[ii + 1, 3] = v1 edges[ii + 2, 3] = v2 # Demi-arrête opposée v0, v1, v2 = tgls[i, :] print '@@' print v0, v1 if opp.has_key((v0, v1)): e = opp.pop((v0, v1)) edges[e, 2] = ii edges[ii, 2] = e print 'FOUND : %d' % e else: print 'ADD' opp[(v0, v1)] = ii print opp print v1, v2 if opp.has_key((v1, v2)): e = opp.pop((v1, v2)) edges[e, 2] = ii + 1 edges[ii + 1, 2] = e print 'FOUND : %d' % e else: print 'ADD' opp[(v1, v2)] = ii + 1 print opp print v0, v2 if opp.has_key((v0, v2)): e = opp.pop((v0, v2)) edges[e, 2] = ii + 2 edges[ii + 2, 2] = e print 'FOUND : %d' % e else: print 'ADD' opp[(v0, v2)] = ii + 2 print opp print '@@' # Face droite edges[ii:ii + 3, 4] = i print ii ii += 3 print 'done triangle %d' % i print edges