sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    🫛 Lightbeans Update | Metallic and Roughness auto-applied in SketchUp 2025+ Download

    Rotate and Intersect a plane

    Scheduled Pinned Locked Moved Developers' Forum
    7 Posts 2 Posters 497 Views 2 Watching
    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.
    • G Offline
      Garry K
      last edited by

      I'm probably just too tired to see it - oh well.

      I first create a face which is parallel to the Y axis and offset 1/2"
      I then create a line and intersect the plane of the face.

      The line
      10.000000",0.000000",5.000000"
      10.000000",5.000000",5.000000"

      The plane
      -0.0
      1.0
      -0.0
      -0.5
      the result of the intersect
      (11", 0.5", 5.5")

      I was expecting ( 10", 0.5", 5" )
      It appears that the the plane may have its point at the origin.

      Here is the code

      y = 0.5.inch
      face = grp.entities.add_face( [[0,y,-10],[0,y,200],[200,y,200],[200,y,-10]] )

      p1 = [ 10.inch, 0.inch, 5.inch ]
      p2 = [ 10.inch, 5.inch, 5.inch ]
      line = [ p1, p2 ]
      p3 = Geom.intersect_line_plane( line, face.plane )

      1 Reply Last reply Reply Quote 0
      • G Offline
        Garry K
        last edited by

        I should mention that I am planning on rotating the face. If there is a way to simply rotate a plane then that would even be better.

        1 Reply Last reply Reply Quote 0
        • TIGT Offline
          TIG Moderator
          last edited by

          A plane is defined by:
          plane = [a_point, a_normal_vector]
          So you can rotate a vector using a rotation-transformation:
          tr = Geom::Transformation.rotation(a_point, an_axis_vector, an_angle)
          Remember that:
          angle**.degrees**
          allows you to specify it in degrees - no need to mess on with radians/PI etc.
          Also there are built-in constants for:
          ORIGIN [0,0,0], X_AXIS [1,0,0], Y_AXIS [0,1,0], Z_AXIS [0,0,1]
          You can reverse any vector with:
          vector.reverse
          To transform a vector use:
          vector.transform!(tr)
          which rotates the vector from where it is currently.

          You can use:
          entities.transform_entities(transformation, objects)
          'objects' can be vertices, edges, faces, group, component_instance etc
          These can move, scale or rotate.
          Note that Points must be transformed with:
          point.transform(transformation)

          TIG

          1 Reply Last reply Reply Quote 0
          • G Offline
            Garry K
            last edited by

            Thanks TIG.

            Ah - I see this could be handy if you have 2 lines and want to see where they would meet even if you have to extend one or both lines.

            Essentially if I want to determine if the point returned from intersect_line_line is on both lines - which answers the problem that I need to solve - then I have to perform an additional check to see if the resulting point is not nil and lies on the line.

            So I can rotate 2 points around the origin ( which is what I need to do ) and then convert the rotated edge to a vector.

            cos_theta = Math.cos( angle )
            sin_theta = Math.sin( angle )

            x3 = cos_theta * x1 - sin_theta * y1
            y3 = sin_theta * x1 + cos_theta * y1

            x4 = cos_theta * x2 - sin_theta * y2
            y4 = sin_theta * x2 + cos_theta * y2

            And since I want to rotate a vertical plane z stays as 0 and I simply pop in dx and dy of the edge for the vector and use the first point as is. Then I can use intersect_line_line

            1 Reply Last reply Reply Quote 0
            • TIGT Offline
              TIG Moderator
              last edited by

              You are muddling 'edge' and 'line'.
              In SketchUp an edge has a line.
              edge.line >> [point, vector]
              To see if two lines intersect
              geom.intersect_line_line(line1, line2)
              returns a point if they do, or nil if they don't.
              If you have a point it has 4 possible vertex matches: if it falls on the start or end of an edge, and there are 2 edges...
              point==edge1.start.position point==edge2.start.position point==edge1.end.position point==edge2.end.position
              returns true or false
              If the point falls on an edge you test it thus:
              point.vector_to(edge1.end.position)==edge1.line[1]
              and
              point.vector_to(edge2.end.position)==edge2.line[1]
              If true the intersect's point falls on the edge [between the start/end] and not on a vertex.

              TIG

              1 Reply Last reply Reply Quote 0
              • G Offline
                Garry K
                last edited by

                Sorry - I am not making myself clear. From a CAD point of view. What I have drawn are 2 lines that do not intersect.

                I initially assumed ( at 2:00 in the morning ) that the intersect_line_line method took 2 CAD lines as arguments.

                I now realize that the method wants 2 mathematical lines expressed as a ray and in this case will return a point because mathematically these CAD lines are simply 2 points on an infinite line and these 2 infinite lines do indeed intersect.

                All I was trying to do was find a method that would give me a point if the 2 lines that I drew cross each other.


                In CAD these are 2 lines

                1 Reply Last reply Reply Quote 0
                • TIGT Offline
                  TIG Moderator
                  last edited by

                  Please stop calling them 'lines' 😉 - I know that's the CAD name but in SketchUp Ruby code they are best called 'edges' - I know some SketchUp tools refer to drawing 'lines' and there's even an API method add_line() that adds an edge 😒 BUT when we are talking code - especially if we are taking about edge.line - it's a recipe for confusion to muddle up the two terms...

                  I tried to explain the difference between an edge and a line [edge.line]...

                  The two perpendicular edges you drew will only return a point with the intersect_line_line() IF they intersect - i.e. they are 'coplanar'... looking down 'in plan' does not mean they do intersect if their 'z' values not equal...
                  Assuming they do return a point, then my previous post explains how you can then tell if that point falls 'in space', or either of the edges' vertices, or on an edge in between its start/end...
                  It'd be quite possible to slide your example edges around so that they then return a point 'in space' that is on neither edge...

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • 1 / 1
                  • First post
                    Last post
                  Buy SketchPlus
                  Buy SUbD
                  Buy WrapR
                  Buy eBook
                  Buy Modelur
                  Buy Vertex Tools
                  Buy SketchCuisine
                  Buy FormFonts

                  Advertisement