sketchucation logo sketchucation
    • Login
    🤑 SketchPlus 1.3 | 44 Tools for $15 until June 20th Buy Now

    Geometry, Transformation, and Scaling

    Scheduled Pinned Locked Moved Developers' Forum
    5 Posts 4 Posters 520 Views 4 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.
    • A Offline
      Anton_S
      last edited by

      Hello, during experimenting with transformation and scaling, I've got a bit stucked. I plan and planned to create a spring that would scale itself from point1 to point2. Some visual index should explain;
      start position
      2
      3
      I want to know how to calculate pink solid new transformation, knowing current position of all 4 points, and transformation of pinksolid.

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

        You know where p1 and p2 are in 3d space.
        So getting the distance between them is straightforward
        dist=p1.distance(p2)
        You need to know the original size of the 'box' spring - easiest if you make it a 1" cube!
        Otherwise adjust dist=dist/boxz ...
        So you can make a scaling transformation using x=1, y=1 and z=dist
        So far so good.
        The box is now the right height but not yet rotated.
        Make a reference plane based on p1.
        planex=[p1, Y_AXIS]
        We'll use this to project p2 so we get a 'flat' angle.
        p2px=p2.project.to_plane(planex)
        get the angle between the model axis and the vector from p1 to the projected point...
        angx=X_AXIS.angle_between(p1.vector_to(p2px))
        If there's a chance that p2 is below p1 test for that [compare their .z] and then make the 'angle' negative to suit [you can also do it by doing a .cross on the two vectors and checking the resultant vector's x/y/z values]
        So now we have the angle needed in a rotation transformation [ tr] about p1 and the X_AXIS.
        Apply that to the 'box'.
        The box is still not aligned [unless p1 and p2 are axially planar].
        Apply the transformation 'tr' using p2.transform!(tr) and repeat its projection onto a second plane planey=[p1, X_AXIS]
        Now repeat finding the 'flat' angle and make a second rotation transformation with that and the relevant axis... and now the 'box' should rotate into place...
        😕

        TIG

        1 Reply Last reply Reply Quote 0
        • thomthomT Offline
          thomthom
          last edited by

          <span class="syntaxdefault"><br />model </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Sketchup</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">active_model<br /><br /></span><span class="syntaxcomment"># Instances<br /></span><span class="syntaxdefault">base1 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">definitions</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Base1'</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">instances</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br /></span><span class="syntaxdefault">base2 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">definitions</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Base2'</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">instances</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br /></span><span class="syntaxdefault">spring </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> model</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">definitions</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Spring'</span><span class="syntaxkeyword">].</span><span class="syntaxdefault">instances</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">]<br /><br /></span><span class="syntaxcomment"># References<br /></span><span class="syntaxdefault">base1_pt </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">4</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">7</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">base2_pt </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base2</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> base2</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">3</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">vector </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> base1_pt</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">vector_to</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> base2_pt </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Height Scaling<br /></span><span class="syntaxdefault">pt1 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">0</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">3</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">pt2 </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Point3d</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">linear_combination</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">4</span><span class="syntaxkeyword">),</span><span class="syntaxdefault"> 0.5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">bounds</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">corner</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">7</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">height </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> pt1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">distance</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> pt2 </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">ratio </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> vector</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">length </span><span class="syntaxkeyword">/</span><span class="syntaxdefault"> height<br />tr_scale </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Transformation</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">scaling</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> pt1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 1</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> ratio </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Axes<br /></span><span class="syntaxdefault">tr_orientation </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Transformation</span><span class="syntaxkeyword">.new(</span><span class="syntaxdefault"> ORIGIN</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> vector </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Move<br /></span><span class="syntaxdefault">pt1_on_new_plane </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> pt1</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">transform</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> tr_orientation </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">tr_translate </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> Geom</span><span class="syntaxkeyword">;;</span><span class="syntaxdefault">Transformation</span><span class="syntaxkeyword">.new(</span><span class="syntaxdefault"> pt1_on_new_plane</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">vector_to</span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> base1_pt </span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /><br /></span><span class="syntaxcomment"># Transformation<br /></span><span class="syntaxdefault">tr </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> tr_translate </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> tr_orientation </span><span class="syntaxkeyword">*</span><span class="syntaxdefault"> tr_scale<br /><br />spring</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">transform</span><span class="syntaxkeyword">!(</span><span class="syntaxdefault"> tr </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault"> </span>
          

          Test Model

          Thomas Thomassen — SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund

          1 Reply Last reply Reply Quote 0
          • sdmitchS Offline
            sdmitch
            last edited by

            To use ThomThom's code as a subroutine that can be called multiple times following a move of either base, you will need to return the spring to its initial position.

            	vector = base1_pt.vector_to( base2_pt )
            
            	# Initialize spring position
            	tr_init = spring.transformation
            	spring.transform! tr_init.inverse
            
            	# Height Scaling
            
            

            Nothing is worthless, it can always be used as a bad example.

            http://sdmitch.blogspot.com/

            1 Reply Last reply Reply Quote 0
            • A Offline
              Anton_S
              last edited by

              Tnks!
              All logical and useful 👍

              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