{"id":306,"date":"2009-06-04T11:46:20","date_gmt":"2009-06-04T18:46:20","guid":{"rendered":"https:\/\/actionsnippet.com\/?p=1499"},"modified":"2009-06-04T11:46:20","modified_gmt":"2009-06-04T18:46:20","slug":"distance-between-point-and-line-optimized","status":"publish","type":"post","link":"https:\/\/actionsnippet.com\/?p=306","title":{"rendered":"Distance Between Point and Line (optimized)"},"content":{"rendered":"<pre class=\"brush: as3; title: ; notranslate\" title=\"\">\r\n\r\n\/**\r\nOriginal function by Pieter Iserbyt:\r\nhttp:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/pointline\/DistancePoint.java\r\nfrom Paul Bourke&#039;s website:\r\nhttp:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/pointline\/\r\n*\/\r\nfunction pointToLineDist(x1:Number, y1:Number, x2:Number, y2:Number,x3:Number, y3:Number):Number {\r\n\tvar dx:Number=x2-x1;\r\n\tvar dy:Number=y2-y1;\r\n\tif (dx==0&amp;&amp;dy==0) {\r\n\t\tx2+=1;\r\n\t\ty2+=1;\r\n\t\tdx=dy=1;\r\n\t}\r\n\tvar u:Number = ((x3 - x1) * dx + (y3 - y1) * dy) \/ (dx * dx + dy * dy);\r\n\r\n\tvar closestX:Number;\r\n\tvar closestY:Number;\r\n\tif (u&lt;0) {\r\n\t\tclosestX=x1;\r\n\t\tclosestY=y1;\r\n\t} else if (u &gt; 1) {\r\n\t\tclosestX=x2;\r\n\t\tclosestY=y2;\r\n\t} else {\r\n\t\tclosestX=x1+u*dx;\r\n\t\tclosestY=y1+u*dy;\r\n\t}\r\n\tdx=closestX-x3;\r\n\tdy=closestY-y3;\r\n\treturn Math.sqrt(dx * dx +  dy * dy);\r\n}\r\n\r\n\/**\r\nTest out the function\r\n*\/\r\n\r\nvar dotA:Sprite = dot(100, 100);\r\nvar dotB:Sprite = dot(200, 200);\r\nvar dotC:Sprite = dot(150, 100, 0x0000FF);\r\nvar txt:TextField = TextField(dotC.addChild(new TextField()));\r\nwith(txt) x = 5, y = 5, autoSize = &quot;left&quot;, selectable = false, mouseEnabled = false;\r\n\r\naddEventListener(Event.ENTER_FRAME, onLoop);\r\nfunction onLoop(evt:Event):void {\r\n\tgraphics.clear();\r\n\tgraphics.lineStyle(0,0x000000);\r\n\tgraphics.moveTo(dotA.x, dotA.y);\r\n    graphics.lineTo(dotB.x, dotB.y);\r\n\ttxt.text = pointToLineDist(dotA.x, dotA.y, dotB.x, dotB.y, dotC.x, dotC.y).toFixed(2);\r\n}\r\n\r\n\/\/ draggable dot\r\nfunction dot(xp:Number, yp:Number, col:uint = 0xFF0000, rad:Number=4):Sprite {\r\n    var s:Sprite = Sprite(addChild(new Sprite));\r\n    s.x = xp;\r\n    s.y = yp;\r\n    with(s.graphics) beginFill(col), drawCircle(0,0,rad);\r\n    s.buttonMode = true;\r\n    s.addEventListener(MouseEvent.MOUSE_DOWN, onDrag);\r\n    return s;\r\n}\r\nfunction onDrag(evt:MouseEvent):void { evt.currentTarget.startDrag() }\r\nstage.addEventListener(MouseEvent.MOUSE_UP, onUp);\r\nfunction onUp(evt:MouseEvent):void{stopDrag() }\r\n<\/pre>\n<p>This is the same as yesterdays post about the distance between a point and a line segment. I just took a few minutes to optimize the function &#8211; it runs close to 3X faster now. For more info see <a href=\"https:\/\/actionsnippet.com\/?p=1494\">yesterdays post.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\/** Original function by Pieter Iserbyt: http:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/pointline\/DistancePoint.java from Paul Bourke&#039;s website: http:\/\/local.wasp.uwa.edu.au\/~pbourke\/geometry\/pointline\/ *\/ function pointToLineDist(x1:Number, y1:Number, x2:Number, y2:Number,x3:Number, y3:Number):Number { var dx:Number=x2-x1; var dy:Number=y2-y1; if (dx==0&amp;&amp;dy==0) { x2+=1; y2+=1; dx=dy=1; } var u:Number = ((x3 &#8211; x1) * dx + (y3 &#8211; y1) * dy) \/ (dx * dx + dy * dy); var closestX:Number; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[114,121,94],"tags":[3,14,4],"class_list":["post-306","post","type-post","status-publish","format-standard","hentry","category-graphics-algorithms","category-math","category-misc","tag-actionscript","tag-as3","tag-flash"],"_links":{"self":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/posts\/306","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=306"}],"version-history":[{"count":0,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=\/wp\/v2\/posts\/306\/revisions"}],"wp:attachment":[{"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=306"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=306"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/actionsnippet.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=306"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}