sketchucation logo sketchucation
    • Login
    ℹ️ Licensed Extensions | FredoBatch, ElevationProfile, FredoSketch, LayOps, MatSim and Pic2Shape will require license from Sept 1st More Info

    Rotate and Intersect a plane

    Scheduled Pinned Locked Moved Developers' Forum
    7 Posts 2 Posters 462 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