[bknr-cvs] ksprotte changed trunk/projects/bos/m2/m2.lisp

BKNR Commits bknr at bknr.net
Fri Jul 18 12:28:05 UTC 2008


Revision: 3502
Author: ksprotte
URL: http://bknr.net/trac/changeset/3502

optimized contract-compute-largest-rectangle that also helped to avoid a screamer fail on a certain contract
U   trunk/projects/bos/m2/m2.lisp

Modified: trunk/projects/bos/m2/m2.lisp
===================================================================
--- trunk/projects/bos/m2/m2.lisp	2008-07-18 11:43:24 UTC (rev 3501)
+++ trunk/projects/bos/m2/m2.lisp	2008-07-18 12:28:05 UTC (rev 3502)
@@ -1,3 +1,4 @@
+
 (in-package :bos.m2)
 
 ;;; 
@@ -392,49 +393,55 @@
     (let* ((m2s (contract-m2s contract))
            (area (length m2s))
            (scaler (ceiling area 1000.0))
-           (bounding-box (contract-bounding-box contract)))
-      (geometry:with-rectangle bounding-box
-        (declare (ignore width height))
-        (labels ( ;; to-orig
-                 (distance-to-orig (d)
-                   (when-scaling-needed d
-                                        (round (* d scaler))))
-                 (x-coordinate-to-orig (x)
-                   (when-scaling-needed x
-                                        (+ left (round (* (- x left) scaler)))))
-                 (y-coordinate-to-orig (y)
-                   (when-scaling-needed y
-                                        (+ top (round (* (- y top) scaler)))))
-                 (rectangle-to-orig (r)
-                   (when-scaling-needed r
-                                        (geometry:with-rectangle r
-                                          (list (x-coordinate-to-orig left)
-                                                (y-coordinate-to-orig top)
-                                                (distance-to-orig width)
-                                                (distance-to-orig height)))))
-                 ;; from-orig
-                 (distance-from-orig (d)
-                   (when-scaling-needed d
-                                        (floor d scaler)))
-                 (x-coordinate-from-orig (x)
-                   (when-scaling-needed x
-                                        (+ left (floor (- x left) scaler))))
-                 (y-coordinate-from-orig (y)
-                   (when-scaling-needed y
-                                        (+ top (floor (- y top) scaler))))
-                 (rectangle-from-orig (r)
-                   (when-scaling-needed r
-                                        (geometry:with-rectangle r
-                                          (list (x-coordinate-from-orig left)
-                                                (y-coordinate-from-orig top)
-                                                (distance-from-orig width)
-                                                (distance-from-orig height))))))
-          (rectangle-to-orig
-           (screamer-user:largest-rectangle
-            (rectangle-from-orig bounding-box)
-            (lambda (x y)
-              (let ((m2 (get-m2 (x-coordinate-to-orig x) (y-coordinate-to-orig y))))
-                (and m2 (eql contract (m2-contract m2))))))))))))
+           (bounding-box (contract-bounding-box contract))
+	   (bounding-width (third bounding-box))
+	   (bounding-height (fourth bounding-box)))
+      (if (= area (* bounding-width bounding-height))
+	  ;; no need to run screamer here, since we already know the
+	  ;; answer
+	  bounding-box
+	  (geometry:with-rectangle bounding-box
+	    (declare (ignore width height))
+	    (labels ( ;; to-orig
+		     (distance-to-orig (d)
+		       (when-scaling-needed d
+					    (round (* d scaler))))
+		     (x-coordinate-to-orig (x)
+		       (when-scaling-needed x
+					    (+ left (round (* (- x left) scaler)))))
+		     (y-coordinate-to-orig (y)
+		       (when-scaling-needed y
+					    (+ top (round (* (- y top) scaler)))))
+		     (rectangle-to-orig (r)
+		       (when-scaling-needed r
+					    (geometry:with-rectangle r
+					      (list (x-coordinate-to-orig left)
+						    (y-coordinate-to-orig top)
+						    (distance-to-orig width)
+						    (distance-to-orig height)))))
+		     ;; from-orig
+		     (distance-from-orig (d)
+		       (when-scaling-needed d
+					    (floor d scaler)))
+		     (x-coordinate-from-orig (x)
+		       (when-scaling-needed x
+					    (+ left (floor (- x left) scaler))))
+		     (y-coordinate-from-orig (y)
+		       (when-scaling-needed y
+					    (+ top (floor (- y top) scaler))))
+		     (rectangle-from-orig (r)
+		       (when-scaling-needed r
+					    (geometry:with-rectangle r
+					      (list (x-coordinate-from-orig left)
+						    (y-coordinate-from-orig top)
+						    (distance-from-orig width)
+						    (distance-from-orig height))))))
+	      (rectangle-to-orig
+	       (screamer-user:largest-rectangle
+		(rectangle-from-orig bounding-box)
+		(lambda (x y)
+		  (let ((m2 (get-m2 (x-coordinate-to-orig x) (y-coordinate-to-orig y))))
+		    (and m2 (eql contract (m2-contract m2)))))))))))))
 
 (defun contract-neighbours (contract)
   "Return all contracts that have an adjacent m2 to one of CONTRACT's m2s.




More information about the Bknr-cvs mailing list