diff --git a/T3/lines.js b/T3/lines.js
index 12bda3fd17463639447108adfa9341123f587f54..8935ae5d3c56e4e7f3b73b9c6b50ae92e3f505ff 100644
--- a/T3/lines.js
+++ b/T3/lines.js
@@ -79,6 +79,12 @@ function handleMouseUp() {
   draggingSecondEnd = false;  
 }
 
+function distance(x0,y0,xf,yf) {
+  power2X = Math.pow(x0 - xf,2);
+  power2Y = Math.pow(y0 - yf,2);
+  return Math.sqrt(power2X + power2Y);
+}
+
 function dragLine() {
   if (selectedLine != null) {
     if (movingEntireLine) {      
@@ -140,6 +146,11 @@ function dragLine() {
   }
 }
 
+function isOnLine(x0, y0, xf, yf, px, py) {
+    var f = function(somex) { return (yf - y0) / (xf - x0) * (somex - x0) + y0; };
+    return Math.abs(f(px) - py) < 20 && px >= x0 && px <= xf;      
+}
+
 function handleMouse() {
   if (mouseDown && selectedLine == null) {
     for (var i = lines.length - 1; i >= 0; i--) {
@@ -147,11 +158,13 @@ function handleMouse() {
         selectedLine = i;
         movingEntireLine = true;
         break;
-      } else if (mouseX >= lines[i].x0 - 20 && mouseX <= lines[i].x0 + 20 && mouseY >= lines[i].y0 - 20 && mouseY <= lines[i].y0 + 20) {
+      } else if (mouseX >= lines[i].x0 - 20 && mouseX <= lines[i].x0 + 20 && 
+        mouseY >= lines[i].y0 - 20 && mouseY <= lines[i].y0 + 20) {
         selectedLine = i;
         draggingFirstEnd = true;
         break;
-      } else if (mouseX >= lines[i].xf - 20 && mouseX <= lines[i].xf + 20 && mouseY >= lines[i].yf - 20 && mouseY <= lines[i].yf + 20) {
+      } else if (mouseX >= lines[i].xf - 20 && mouseX <= lines[i].xf + 20 
+        && mouseY >= lines[i].yf - 20 && mouseY <= lines[i].yf + 20) {
         selectedLine = i;
         draggingSecondEnd = true;
         break;
@@ -159,7 +172,16 @@ function handleMouse() {
     }
   } else if (rightClick) {
     for (var i = lines.length - 1; i >= 0; i--) {
-      if ((mouseY >= lines[i].y0 && mouseY <= lines[i].yf) || (mouseY >= lines[i].yf && mouseY <= lines[i].y0)) {
+      //       distanceMouseX0 = distance(mouseX,mouseY,lines[i].x0,lines[i].y0);
+      // distanceMouseXF = distance(mouseX,mouseY,lines[i].xf,lines[i].yf);
+      // distanceX0XF = distance(lines[i].x0,lines[i].y0,lines[i].xf,lines[i].yf);
+      // console.log(distanceMouseX0,distanceMouseXF,distanceX0XF);
+      // if ((distanceMouseX0 + distanceMouseXF >= distanceX0XF - 20) && (distanceMouseX0 + distanceMouseXF <= distanceX0XF + 20)) {
+      //console.log("isOnLine: ", isOnLine(lines[i].x0,lines[i].y0,lines[i].xf,lines[i].yf,mouseX,mouseY));
+      var mouseOnLine = isOnLine(lines[i].x0,lines[i].y0,lines[i].xf,lines[i].yf,mouseX,mouseY)
+                    || isOnLine(lines[i].xf,lines[i].yf,lines[i].x0,lines[i].y0,mouseX,mouseY);
+      console.log(mouseOnLine);
+      if (mouseOnLine) {
         if (mouseX >= lines[i].x0 && mouseX <= lines[i].xf) {
           lines[lines.length] = new Line(mouseX,mouseY,lines[i].xf,lines[i].yf);
           lines[i].xf = mouseX;
@@ -170,7 +192,7 @@ function handleMouse() {
           lines[i].centerY = lines[i].y0 + lines[i].height/2;      
           rightClick = 0;
           break;
-        } else if (mouseX < lines[i].x0 && mouseX > lines[i].xf) {
+        } else if (mouseX <= lines[i].x0 && mouseX >= lines[i].xf) {
           lines[lines.length] = new Line(mouseX,mouseY,lines[i].x0,lines[i].y0);
           lines[i].x0 = mouseX;
           lines[i].y0 = mouseY;
@@ -190,54 +212,18 @@ function generatePolygon() {
   edges = parseInt(document.getElementById("number").value,10);
   if (edges >= 3 && edges <= 8) {
     lines = [];
-    switch (edges) {
-      case 3:
-        lines = [new Line(centerX,centerY-300,centerX+300,centerY+300), //linha \
-                 new Line(centerX,centerY-300,centerX-300,centerY+300), //linha /
-                 new Line(centerX-300,centerY+300,centerX+300,centerY+300)]; //linha _
-        break;
-      case 4:
-        lines = [new Line(centerX-300,200,centerX+300,200), //linha _ topo
-                 new Line(centerX+300,200,centerX+300,800), //linha | direita
-                 new Line(centerX-300,200,centerX-300,800), //linha | esquerda
-                 new Line(centerX-300,800,centerX+300,800)]; //linha _ baixo
-        break;
-      case 5:
-        lines = [new Line(centerX,centerY-350,centerX+300,centerY-150), //linha \ direita 
-                 new Line(centerX,centerY-350,centerX-300,centerY-150), //linha / esquerda 
-                 new Line(centerX+300,centerY-150,centerX+215,centerY+200), //linha \ esquerda
-                 new Line(centerX-300,centerY-150,centerX-215,centerY+200), //linha / direita
-                 new Line(centerX-215,centerY+200,centerX+215,centerY+200)]; //linha _ baixo
-        break;
-      case 6:
-        lines = [new Line(centerX-200,200,centerX+200,200), //linha _ topo
-                 new Line(centerX-200,200,centerX-400,550), //linha / esq
-                 new Line(centerX-400,550,centerX-200,900), //linha \ esq
-                 new Line(centerX+200,200,centerX+400,550), //linha / dir
-                 new Line(centerX+400,550,centerX+200,900), //linha \ dir
-                 new Line(centerX-200,900,centerX+200,900)]; //linha _ baixo
-        break;
-      case 7:
-        lines = [new Line(centerX-250,300,centerX,200), //linha / topo
-                 new Line(centerX,200,centerX+250,300), //linha / topo
-                 new Line(centerX-250,300,centerX-350,630), //linha / esq
-                 new Line(centerX+250,300,centerX+350,630), //linha \ dir
-                 new Line(centerX-350,630,centerX-170,900), //linha \ esq
-                 new Line(centerX+350,630,centerX+170,900), //linha / dir
-                 new Line(centerX-170,900,centerX+170,900)]; //linha _ baixo
-        break;
-      case 8:
-        lines = [new Line(centerX-220,100,centerX+220,100), //linha _ topo
-                 new Line(centerX-220,100,centerX-420,375), //linha / esq
-                 new Line(centerX-420,375,centerX-420,650), //linha | esq
-                 new Line(centerX-420,650,centerX-220,925), //linha \ esq
-                 new Line(centerX+220,100,centerX+420,375), //linha / esq
-                 new Line(centerX+420,375,centerX+420,650), //linha | esq
-                 new Line(centerX+420,650,centerX+220,925), //linha \ esq
-                 new Line(centerX-220,925,centerX+220,925)]; //linha _ baixo
-        break;
-      default:
-        break;
+    var tmpx0 = centerX + 300;
+    var tmpy0 = centerY;
+
+    var edge = (2 * Math.PI)/edges;
+    for (var i = 0; i < edges; i++) {
+      var angle = edge * (i+1);
+      var tmpxf = 300 * Math.cos(angle) + centerX;
+      var tmpyf = 300 * Math.sin(angle) + centerY;
+      lines[i] = new Line(tmpx0, tmpy0, tmpxf,tmpyf);
+      console.log(lines[i]);
+      tmpx0 = tmpxf;
+      tmpy0 = tmpyf;
     }
     drawCurrentCanvas();
   } else {