HISE Logo Forum
    • Categories
    • Register
    • Login

    Detect if two paths intersect

    Scheduled Pinned Locked Moved Scripting
    6 Posts 3 Posters 347 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • E
      ericchesek
      last edited by ericchesek

      Is there an easy way to detect if two paths intersect? I want to make a circular XY pad, but I want the outer perimeter of the draggable XY cursor (tiny circle) to stop at the pad's boundaries (larger circle). Ideally, the script would work for arbitrary path shapes.

      I can check if the pad's boundaries contains my mouse cursor position while clicking or dragging, but that does not account for the shape of the draggable XY cursor. It also leads to a case where the draggable XY cursor stops in an odd position if I drag my mouse quickly outside of the pad's boundaries.

      See the snippet for what I've done so far.

      HiseSnippet 1359.3ocsW02SaaDF+LfaW7V2Vk1GfS8eVPxMDfR2jPSsk.LEsRaTSWEUHT0E6KNmv4NK6y.Vq7O6S19HsuAaOO2YmbYjzMgVQQDtmW+cOucOLHWEwKJT4DuVusJiS79J+gUR8jdSXBIo+gDuuz+nzTQVA+z2SNnJiUTviIddq+yn.ds1fX94Oe1ArTlLhOmDg7NkHh+RwTgdN0AO+WDooGyh4uUL0Q5m779QJYOUppD.y59cIYrnKXI7WwPwVym3cuihEZU9PMSyKHdabfJtZ3D0URq7uSTHFkxwCaSFBFxR9XUZLhXjJo2DQZ7flKcAArxf4gf0sgfuy+DQrXF84ghu0vfNWC23g2ZKBu0W.da6ButNvaIPxyARaXgzC8GFkKxzy4XSM8kZd9XFD1cghUVxZe8886o.Ij5NSYWvONGNLSi1Osa2PJ7qM2OHXqsnCXRdZ.jCJzzKY4zLY5oum9SzFKjv08TSyTR3P6GY39HP0OI6NEHUoNWk1iklNBxnsURCyZx0NuWNGhZTvgYrXJSFSiJygqoCd.8UWwiGvzSbPUjQQjXavTykNVoWoTf+NPjPiD4Qobvg5I21Mu.z.LvY6rWH7AhROdut0ec99ANXoCKNttAositV27RgVCtX4dBfXiW5F1MbW7CXafrqMqkpNNchprfSm.AnTgLIvDIwfrg9rP73RYjVnjs4WB29MC9sfVhwT6oNw4rD5G+H0dJJUDcAOdyfVfPsfOfSzSDETv9bZLWyizEzoF2loJDnYoWI.Qjfb7lvk4tERGUpoPEu0LwJZeJV2QEZ5Up7KnrB2rXGHTngVqh1LYEXbgTSExnzRncE9CL9rI8YfsP7zIloYcDE8kEhXNDyVpgNydotNz9c04PXq4VojoUvE4RtA2XTHgMBSNlBsUcm.cwP2sg.DwLgLGzcM.qZ.r+hbplwoB4biETF9QPxLgGC0k.oanA2TmoOLmcEpSdkdgL8.3hpeipDnxmmnSfjLnO1IwRiJSwlIrKp.FHUegU5uuvzf0jECZgUgHncuBOtot7rcNeqcfi6ruUvpEDrxQvcmIXPqjNigw6uHMsscTdQmjbdElFLnSWlaiw0c5pb712jCfxNgM+tXJXkY.LAjXGxfNalOsl0j7s.xz56TxDtP8CL65.UoLtn81c5tIp1MM.NFSCN.tdrzR85nzRiOcbIDhBO65vpv4A0v4gsy27Vto4hyvICPVFaCWk2fVcq6PsWxLnP5t.+lBp2vyvRGiWxvY8PGAMxNENPHM86M0SzEGR2NpYxdHL4Buk3HkYD6jaMMNaEBbNF4UJM+0x1FwCtIf9OYMd7R4U61Td9RYiKNj+oTrsrb5HdtKXQAgWSW7IZ+U+Ds6FDQ1WQbDTI6KE5WmwkqZuBR8SOve8q8ODJaw20qoAxkwy0BDBdGxuDVRx9JeK+C4EWnUYFYqitDu.sg6CZ1A.SdDA7R+88MYIx0tKcU4d3JQrdxLB+wu+7IbQxDsKESASySG.h9Fen6kNmvnjlkxZcu+B9AUSn4S+TT2wkL41qy.KRohwoTKtcEtRYMCHetvJM3ZKPWutxcky+2V45+JDen+.gNZxxw3ZKAiPV+yAFqWT8A9GMdL7.8b.tg+wm94YqTh8MmjSX5bATv4+pxoCgTcDG7tDpHw9Iu0vJe64t3YLBLjKiMGvBhZlaim8pYtcCSxTVTt5C0CkvUg+BCE.SRy+EPK+SvyzsIlNa237TXy7ODEsnotkh6bWUb26phO4tp3d2UEe5cUwe3tp3O9uqH9ON8hRsZpssgPNYvQlwhddGIw8vLUqj+FPM8iEX
      
      LindonL 1 Reply Last reply Reply Quote 0
      • LindonL
        Lindon @ericchesek
        last edited by

        @ericchesek measure the distance of your small circle from the centre of your large circle (simple trig) if >= radius of big circle then you are outside the big circle..

        HISE Development for hire.
        www.channelrobot.com

        E 1 Reply Last reply Reply Quote 0
        • E
          ericchesek @Lindon
          last edited by

          @Lindon Sure, I can do that, but it doesn't address the points in my original post about script working for arbitrary path shapes or the quick mouse movements. :face_savoring_food:

          If it has to be done with trig, so be it!

          ulrikU 1 Reply Last reply Reply Quote 0
          • ulrikU
            ulrik @ericchesek
            last edited by

            @ericchesek if you iterate over the dot.getLength() and get each point of the dots path
            if any point is outside the large circle, set isInside to false?

            		this.data.isInside = true;
            		
            		for (i = 0; i < dot.getLength(); i++)
            		{
            			var p = dot.getPointOnPath(i);
            			if (!allowedPath.contains([event.x-p[0]+dot.getBounds(1)[2]/2, event.y-p[1]+dot.getBounds(1)[3]/2]))
            				this.data.isInside = false;
            		}
            

            Hise Develop branch
            MacOs 15.3.1, Xcode 16.2
            http://musikboden.se

            E 1 Reply Last reply Reply Quote 0
            • E
              ericchesek @ulrik
              last edited by

              @ulrik That's an interesting solution! I came up with something a little different. Any XY cursor and pad shape I use is likely going to be symmetrical, so I have the XY cursor area bounds set to a smaller version of the XY pad shape. When the mouse cursor moves outside of the XY pad bounds, the XY cursor locks to the smaller XY pad shape path. Not perfect for all shapes, but maybe close enough for my needs.

              That's probably difficult to read. lol. Snippet below.

              HiseSnippet 1395.3ocsW0saaaCElJIpcVaEaEXO.D8lo.n4ZmD2Mffh0DmjAiszZT2UzBCiBFIZahHSJHQmDg0bydr1U6QZuAamCorMUiaVQvpgUh44O9wye7n94pXdQgJm303UkYbh2W4OnTpm1cJSHI8Nh38k9GmlJxJ3u4sjCKyXEE7Dhm2l+LJfWisHlO+8OcHKkIi4qHQHuVIh4+pXlPuhZ+m8KhzzSXI7WIl4H8dOqWrR1UkplCfYS+VjLV74rI7myPw1vm3cuiSDZU9.MSyKHdacnJobvT0kRq7uVTHNKkiKZSF.FxR9DUZBhXjJo6TQZR+EG5BBXk9qbAaZcAeq+ohDwR5qbEeigAckFt9CuMpCuMqAu1tvqkC7VCj7bfzVVH8P+Aw4hL8JN1PSOolmOlAtcWnXkkrwede+tJPBot4L147SxgEK0H7IsZEQg+r89AAO9wz9LIOM.hAEZ5ErbZlL8Muk9T5BKLgq6plkojvhvGY39HP0akcyBjpTmqR6xRSOChngJogYE4pMuaNG7ZTXCyXIQTPV0k7DJCHCqjIz344vo1AdWU1mom5fuXiIPhgfQWIXks9Dk1tOeTAQrdUoAW.R0SqAnCPpOkNbmNQv2NcZgOi1OvB0lrjjpJoPqrKN61szZNyuQQeIOVyjSR4gCAy0JZuVQsaMBw55DADnCvGjZzZNNU.qRSHRcnZtLoHrcyVaafvAN96O7bU4+Vb31qSD7sCrWvyn.Guq6AzQopS4op4Eb5THVlJjSBL4.X5gg9xjiwykwZgRFxu.b9aG76AMDio1UMSxYSnu+8T6p3TQ747jsCZ.BYjxEK.90PYaQ3PqzWEY+e4nsAMLpzPOUTzLgoYMEE8jEhDNb.04y4.hqw9JfdkY1uNmxkbJ2uAv5Z3gmVvu0sXLCjvXH7A7MiEPFtdJmJvhyBtwEPyTvR5Yb8kbtjFyQdT03ZEGlZiYFWaUEBXQLpUyRO0sH.i+8b3FNzIXMbmQOdmHWB6BDFEcCuXjwQs8xSQcmk6tODKAtgSqlDsMRbM50MRECoIS3IPAGX6qoAWWkCcTN6RzcmWpqkC0Ghz5WplCT4qRgl.oOf9XEFKMddJ1fAcWEPSZtwcacYeWgouipPXbVAF+GdJbOSeuSojwIsuUtxZxUVWtcMxEzXRywvcdPQVn89shlSx4knyy.uD7Xg3YQmE3j.EIbTQSCTTmkpdVJTnf5NAKHtrdKkH5tnuplUMkx4fKZQNyRyCRU2HNA9n12De11yKyzVO5rYE1irosoU7ngWEUFUyIFUyUgMtVDneIOCColMMCuWhBAlX6MFABIhd5h3Ls9EJgwKtEJBZegnAahrjXybqowl4WuefiQdtRyegLzHdv0AzOj03wqkW01lxyWKabHm7aSwP47YmwycAKJHbye8wI7+3iS3NsSr8ZKGAUxdRg9EYb4GaFHR0ccvu9sdGA4w3LHUz.4x34ZABAui3W.CzYmHog+Q7hy0pLirUdWhWf1v8AKlWACdDALUx88MQIxUtCHV5t3RQhd5RB+0e7robwjoZWJl7yEWV.H5q8ghJ5JBmMYw.jMt2+.eP0DZ9rai5NtjI2bzKXnOUB18n9jf33uULf3YswuvtqPudco63w+uMd3mJDeneegNd55w3FqAiPT+yAFqFp9A9GOdLzueE.2x+j274YBZh8tfImxz4BHgy+4ymM.B0wbX2kPFIVO4sAl4aW2BWidfAbYhYAlPTwrMt1qhY6ELIyXw4p2U0TBGa+KLT.LIMuwRC+Sw0z1DSksqedF7VDuKNttotgh6bWUb26ph6cWUrycUwmbWU7GtqJ9i+2Jhuj2Ay0pY1xFB4z9GaZK54crjAYflrUx+xLqGow
              
              ulrikU 1 Reply Last reply Reply Quote 1
              • ulrikU
                ulrik @ericchesek
                last edited by

                @ericchesek well that's a better solution, well done!

                Hise Develop branch
                MacOs 15.3.1, Xcode 16.2
                http://musikboden.se

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                21

                Online

                1.7k

                Users

                11.8k

                Topics

                102.3k

                Posts