def Monotone(p): print "" if(len(p) <= 3): return 0 PlotPolygon(p) d = dcel() d.createDCELfromPolygon(p) TriangMonotoneUsingDCEL(d) return 0
def Monotone(p): print "" if len(p) <= 3: return 0 PlotPolygon(p) d = dcel() d.createDCELfromPolygon(p) TriangMonotoneUsingDCEL(d) return 0
def LeePreparata(p): print "" if(len(p) <= 3): return 0 PlotPolygon(p) n = len(p) t = avl() d = dcel() d.createDCELfromPolygon(p) od = orderedDCEL(d, p[0], n) event = MergeSort(p, range(0, n)) for i in range(0, n): p[event[i]].hilight('yellow') # Caso 2 - Ponta para cima if(upSpike(p, event[i])): node = t.findNode(p[event[i]]) # Caso nao haja trapezio em cima de do ponto evento if(node == None): left = leftEdge(p, event[i], n) trap = trapezoid(p[event[i]], event[i], p[event[i]], p[(event[i]+left)%n], p[event[i]], p[(event[i]-left)%n]) t.insert(trap) control.sleep () # Caso haja um trapezio em cima do ponto evento else: node.value.leo.lineto(node.value.led, 'green') node.value.reo.lineto(node.value.red, 'green') node.value.top.hilight('green') control.sleep () left = leftEdge(p, event[i], n) trap1 = trapezoid(p[event[i]], event[i], node.value.leo, node.value.led, p[event[i]], p[(event[i]+left)%n]) trap2 = trapezoid(p[event[i]], event[i], p[event[i]], p[(event[i]-left)%n], node.value.reo, node.value.red) insertEdgeUsingOd(od, d, event[i], node) print str(od[event[i]][0].origin)+str(od[node.value.topIndex][0].origin) od[event[i]][0].origin.lineto(od[node.value.topIndex][0].origin, 'red') control.sleep () node.value.leo.remove_lineto(node.value.led) node.value.reo.remove_lineto(node.value.red) node.value.top.unhilight() t.remove(p[event[i]]) t.insert(trap2) t.insert(trap1) # Caso 3 - Ponta para baixo elif(downSpike(p, event[i])): node = t.findNode(p[event[i]]) suc = t.sucessor(node) pred = t.predecessor(node) node.value.leo.lineto(node.value.led, 'green') node.value.reo.lineto(node.value.red, 'green') node.value.top.hilight('green') # Caso haja dois trapezios em cima do ponto evento if(suc != None and suc.value.equal(p[event[i]])): suc.value.leo.lineto(suc.value.led, 'cyan') suc.value.reo.lineto(suc.value.red, 'cyan') suc.value.top.hilight('cyan') control.sleep () trap = trapezoid(p[event[i]], event[i], node.value.leo, node.value.led, suc.value.reo, suc.value.red) if(downSpike(p, node.value.topIndex) and abs(event[i]-node.value.topIndex) > 1): insertEdgeUsingOd(od, d, event[i], node) print str(od[event[i]][0].origin)+str(od[node.value.topIndex][0].origin) od[event[i]][0].origin.lineto(od[node.value.topIndex][0].origin, 'red') if(downSpike(p, suc.value.topIndex) and abs(event[i]-suc.value.topIndex) > 1): insertEdgeUsingOd(od, d, event[i], suc) print str(od[event[i]][0].origin)+str(od[suc.value.topIndex][0].origin) od[event[i]][0].origin.lineto(od[suc.value.topIndex][0].origin, 'red') control.sleep () node.value.leo.remove_lineto(node.value.led) node.value.reo.remove_lineto(node.value.red) node.value.top.unhilight() suc.value.leo.remove_lineto(suc.value.led) suc.value.reo.remove_lineto(suc.value.red) suc.value.top.unhilight() t.remove(p[event[i]]) t.remove(p[event[i]]) t.insert(trap) control.sleep () elif(pred != None and pred.value.equal(p[event[i]])): pred.value.leo.lineto(pred.value.led, 'cyan') pred.value.reo.lineto(pred.value.red, 'cyan') pred.value.top.hilight('cyan') control.sleep () trap = trapezoid(p[event[i]], event[i], pred.value.leo, pred.value.led, node.value.reo, node.value.red) if(downSpike(p, node.value.topIndex) and abs(event[i]-node.value.topIndex) > 1): insertEdgeUsingOd(od, d, event[i], node) print str(od[event[i]][0].origin)+str(od[node.value.topIndex][0].origin) od[event[i]][0].origin.lineto(od[node.value.topIndex][0].origin, 'red') if(downSpike(p, pred.value.topIndex) and abs(event[i]-pred.value.topIndex) > 1): insertEdgeUsingOd(od, d, event[i], pred) print str(od[event[i]][0].origin)+str(od[pred.value.topIndex][0].origin) od[event[i]][0].origin.lineto(od[pred.value.topIndex][0].origin, 'red') control.sleep () node.value.leo.remove_lineto(node.value.led) node.value.reo.remove_lineto(node.value.red) node.value.top.unhilight() pred.value.leo.remove_lineto(pred.value.led) pred.value.reo.remove_lineto(pred.value.red) pred.value.top.unhilight() t.remove(p[event[i]]) t.remove(p[event[i]]) t.insert(trap) control.sleep () # Caso so haja um trapezio em cima do ponto evento else: if(downSpike(p, node.value.topIndex) and abs(event[i]-node.value.topIndex) > 1): insertEdgeUsingOd(od, d, event[i], node) print str(od[event[i]][0].origin)+str(od[node.value.topIndex][0].origin) od[event[i]][0].origin.lineto(od[node.value.topIndex][0].origin, 'red') control.sleep () node.value.leo.remove_lineto(node.value.led) node.value.reo.remove_lineto(node.value.red) node.value.top.unhilight() t.remove(p[event[i]]) control.sleep () # Caso 1 - Uma aresta para cima e outra para baixo else: node = t.findNode(p[event[i]]) node.value.leo.lineto(node.value.led, 'green') node.value.reo.lineto(node.value.red, 'green') node.value.top.hilight('green') if(collinear(node.value.leo, node.value.led, p[event[i]])): trap = trapezoid(p[event[i]], event[i], p[event[i]], p[(event[i]+downEdge(p, event[i], n))%n], node.value.reo, node.value.red) else: trap = trapezoid(p[event[i]], event[i], node.value.leo, node.value.led, p[event[i]], p[(event[i]+downEdge(p, event[i], n))%n]) if(downSpike(p, node.value.topIndex) and abs(event[i]-node.value.topIndex) > 1): insertEdgeUsingOd(od, d, event[i], node) print str(od[event[i]][0].origin)+str(od[node.value.topIndex][0].origin) od[event[i]][0].origin.lineto(od[node.value.topIndex][0].origin, 'red') control.sleep () node.value.leo.remove_lineto(node.value.led) node.value.reo.remove_lineto(node.value.red) node.value.top.unhilight() t.remove(p[event[i]]) t.insert(trap) control.sleep () p[event[i]].unhilight() control.sleep () TriangMonotoneUsingDCEL(d) return 0