<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -67,14 +67,13 @@ module CelticKnot
           far_midpoint = far_edge.virtual_midpoint(far, direction, :enter)
 
           if far_edge == edge
-            difference = 1.0
+            arc = 1.0
           else
-            difference = edge.difference(far_edge, direction)
-            difference = 1.0 if difference == 0.0
+            arc = edge.difference(far_edge, direction)
+            arc = 1.0 if arc == 0.0
           end
 
-          distance = ((far - midpoint).length + (far - far_midpoint).length)
-          magnitude = Math::PI * distance * difference
+          distance = (far - midpoint).length + (far - far_midpoint).length
 
           if $DEBUG
             puts &quot;%d: %s %s&quot; % [step, node, edge]
@@ -83,12 +82,13 @@ module CelticKnot
             puts &quot;   vector:     %s&quot; % vector
             puts &quot;   midpoint:   %s&quot; % midpoint
             puts &quot;   direction:  %s&quot; % direction
-            puts &quot;   difference: %f&quot; % difference
-            puts &quot;   distance:   %f&quot; % distance
-            puts &quot;   magnitude:  %f&quot; % magnitude
+            puts &quot;   arc:        %f&quot; % arc
           end
 
-          thread.add_connection(midpoint, vector.normalize, magnitude, edge.normal?)
+          thread.add_connection(:at =&gt; midpoint, :vector =&gt; vector.normalize,
+            :arc =&gt; arc,
+            :weight =&gt; Math::PI * arc * distance, :intersection =&gt; edge.normal?)
+
           edge.mark(node, direction)
 
           edge, midpoint = far_edge, far_midpoint
@@ -115,13 +115,25 @@ module CelticKnot
         loop do
           far = near[:next]
 
-          near[:curve] = Curves::Hermite.new([near[:at], near[:vector] * near[:magnitude], far[:at], far[:vector] * near[:magnitude]])
+          near_vector = best_vector_for(near) * near[:weight]
+          far_vector  = best_vector_for(far) * near[:weight]
+
+          near[:curve] = Curves::Hermite.new([near[:at], near_vector, far[:at], far_vector])
 
           near = far
           break if near == thread.head
         end
       end
 
+      def best_vector_for(connection)
+        connection[:best_vector] ||= begin
+          prev_at = connection[:prev][:arc] &gt;= 0.5 ? connection[:at] : connection[:prev][:at]
+          next_at = connection[:arc] &gt;= 0.5 ? connection[:at] : connection[:next][:at]
+
+          next_at == prev_at ? connection[:vector] : (next_at - prev_at).normalize
+        end
+      end
+
       def compute_overlaps
         threads.each { |thread| compute_overlaps_for(thread.head) }
       end</diff>
      <filename>lib/celtic_knot/knot.rb</filename>
    </modified>
    <modified>
      <diff>@@ -19,14 +19,9 @@ module CelticKnot
       self
     end
 
-    def add_connection(point, vector, magnitude, intersection)
-      connection = { :at           =&gt; point,
-                     :vector       =&gt; vector,
-                     :magnitude    =&gt; magnitude,
-                     :thread       =&gt; self,
-                     :intersection =&gt; intersection }
-
-      knot.overlaps[point] &lt;&lt; connection
+    def add_connection(data)
+      connection = data.merge(:thread =&gt; self)
+      knot.overlaps[connection[:at]] &lt;&lt; connection
 
       @head ||= connection
       @tail ||= connection</diff>
      <filename>lib/celtic_knot/thread.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>2c80716a81f6923cd3118bd4a564aa577f1111d4</id>
    </parent>
  </parents>
  <author>
    <name>Jamis Buck</name>
    <email>jamis@37signals.com</email>
  </author>
  <url>http://github.com/jamis/celtic_knot/commit/1935fd8d2dac366b57496cecc50c50a895df5acd</url>
  <id>1935fd8d2dac366b57496cecc50c50a895df5acd</id>
  <committed-date>2009-06-17T22:14:22-07:00</committed-date>
  <authored-date>2009-06-17T22:14:22-07:00</authored-date>
  <message>smarter vector interpolation</message>
  <tree>1761c29fb8df9db6092cb9e43f213216536478a7</tree>
  <committer>
    <name>Jamis Buck</name>
    <email>jamis@37signals.com</email>
  </committer>
</commit>
