<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/celtic_knot/knot_shape.rb</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,7 +1,6 @@
 module CelticKnot
   class Direction
     attr_accessor :opposite
-    attr_reader :description
 
     def initialize(clockwise)
       @clockwise = clockwise</diff>
      <filename>lib/celtic_knot/direction.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 require 'celtic_knot/thread'
 require 'celtic_knot/direction'
+require 'celtic_knot/knot_shape'
 require 'curves/hermite'
 
 module CelticKnot
@@ -7,22 +8,27 @@ module CelticKnot
     attr_reader :graph
     attr_reader :threads
     attr_reader :overlaps
+    attr_reader :options
 
-    def initialize(graph)
+    def initialize(graph, options={})
       @graph = graph
       @threads = []
       @overlaps = Hash.new { |h,k| h[k] = [] }
+      @options = options
       generate!
     end
 
+    def draw(draw_options={})
+      KnotShape.new(self, options.merge(draw_options))
+    end
+
     private
 
       def generate!
         compute_crossings
-        define_threads
         compute_overlaps
+        define_threads
         # smooth_threads
-        # decompose
       end
 
       def compute_crossings
@@ -58,22 +64,34 @@ module CelticKnot
           break if thread.closes?(midpoint, vector)
 
           far_edge = far.nearest_edge_to(edge, direction)
-          difference = edge.difference(far_edge, direction)
-          difference = 1.0 if difference == 0.0
-
-# puts &quot;%d: %s %s&quot; % [step, node, edge]
-# puts &quot;   far edge:   %s&quot; % far_edge
-# puts &quot;   parallel:   %s&quot; % parallel
-# puts &quot;   vector:     %s&quot; % vector
-# puts &quot;   midpoint:   %s&quot; % midpoint
-# puts &quot;   direction:  %s&quot; % direction
-# puts &quot;   difference: %f&quot; % difference
-
-          thread.add_connection(midpoint, vector, 4.5 * difference, edge.normal?)
+          far_midpoint = far_edge.virtual_midpoint(far, direction, :enter)
+
+          if far_edge == edge
+            difference = 1.0
+          else
+            difference = edge.difference(far_edge, direction)
+            difference = 1.0 if difference == 0.0
+          end
+
+          distance = ((far - midpoint).length + (far - far_midpoint).length)
+          magnitude = Math::PI * distance * difference
+
+          if $DEBUG
+            puts &quot;%d: %s %s&quot; % [step, node, edge]
+            puts &quot;   far edge:   %s&quot; % far_edge
+            puts &quot;   parallel:   %s&quot; % parallel
+            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
+          end
+
+          thread.add_connection(midpoint, vector.normalize, magnitude, edge.normal?)
           edge.mark(node, direction)
 
-          edge = far_edge
-          midpoint = edge.virtual_midpoint(far, direction, :enter)
+          edge, midpoint = far_edge, far_midpoint
 
           # if the edge is being ignored, then we reverse direction,
           # keeping all else the same. This has the effect of just
@@ -126,7 +144,7 @@ module CelticKnot
           end
 
           c = c[:next]
-          break if c == start
+          break if c.object_id == start.object_id
         end
       end
   end</diff>
      <filename>lib/celtic_knot/knot.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,6 @@ module CelticKnot
     def add_connection(point, vector, magnitude, intersection)
       connection = { :at           =&gt; point,
                      :vector       =&gt; vector,
-                     :vnorm        =&gt; vector.normalize,
                      :magnitude    =&gt; magnitude,
                      :thread       =&gt; self,
                      :intersection =&gt; intersection }
@@ -44,7 +43,7 @@ module CelticKnot
     end
 
     def closes?(point, vector)
-      head &amp;&amp; head[:at] == point &amp;&amp; head[:vnorm] == vector.normalize
+      head &amp;&amp; head[:at] == point &amp;&amp; head[:vector] == vector.normalize
     end
   end
 end</diff>
      <filename>lib/celtic_knot/thread.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0d4d9c91c604a0acd7387a2481a81e3d81bf41bb</id>
    </parent>
  </parents>
  <author>
    <name>Jamis Buck</name>
    <email>jamis@37signals.com</email>
  </author>
  <url>http://github.com/jamis/celtic_knot/commit/dd8340996a57f76df56b9f06c387d1a85e78897e</url>
  <id>dd8340996a57f76df56b9f06c387d1a85e78897e</id>
  <committed-date>2009-06-12T22:28:45-07:00</committed-date>
  <authored-date>2009-06-12T22:28:45-07:00</authored-date>
  <message>add knot interpolation routines (&quot;knot shape&quot;)</message>
  <tree>8e403d0fe8505584a6ae792c00ba694e07795b19</tree>
  <committer>
    <name>Jamis Buck</name>
    <email>jamis@37signals.com</email>
  </committer>
</commit>
