# Thread: Find the highest and lowest mark from the selected "points"

1. ## Find the highest and lowest mark from the selected "points"

Registered forum members do not see this ad.

Hello!
In my drawing there are 200 primitives "point", how would I quickly find the highest and the lowest of them?

2. Hi,

Easily you can do that by retrieving the coordinates of each point then sort them with their Maximum Y coordinate, then finally the first and the last items in the list would be the Highest & Lowest.

3. If the points have been compiled as a list then
Code:
(apply 'max (mapcar 'caddr pt_list))
(apply 'min (mapcar 'caddr pt_list))
There are several other metheods available as well. -David

4. Sorting should be avoided when trying to determine the extrema of a point set, as the set need only be processed once. This may therefore be performed with O(n) efficiency, whereas sorting is generally on the order of O(n log n).

I would therefore suggest something like:
Code:
(defun maxmin ( lst / mni mxa zco zmi zmx )
(setq mni (car lst) zmi (caddr mni) mxa mni zmx zmi)
(foreach  itm (cdr lst)
(setq zco (caddr itm))
(cond
(   (< zmx zco)
(setq mxa itm zmx zco)
)
(   (< zco zmi)
(setq mni itm zmi zco)
)
)
)
(list mni mxa)
)

5. Originally Posted by Lee Mac
Sorting should be avoided when trying to determine the extrema of a point set, as the set need only be processed once. This may therefore be performed with O(n) efficiency, whereas sorting is generally on the order of O(n log n).

I would therefore suggest something like:
Code:
(defun maxmin ( lst / mni mxa zco zmi zmx )
(setq mni (car lst) zmi (caddr mni) mxa mni zmx zmi)
(foreach  itm (cdr lst)
(setq zco (caddr itm))
(cond
(   (< zmx zco)
(setq mxa itm zmx zco)
)
(   (< zco zmi)
(setq mni itm zmi zco)
)
)
)
(list mni mxa)
)
At the command prompt Error: too few arguments (((

6. Worked for me

Code:
(SETQ LST (LIST (LIST 10 20 30)(LIST 20 20 20)(LIST 10 10 100)))
(maxmin lst)

7. Originally Posted by sathalex
At the command prompt Error: too few arguments (((
The function is for use in other programs, it does not define an AutoCAD command.

8. Awesome (effective) function Lee,
Just figured out:
Why don't write something more global using the same algorithm, like accepting function and list arguments (just like vl-sort), i.e.:

Code:
(foo (lambda (r x) (< r x)) '(3 8 9 1 5 6 2 7) )
-> 1
where lambda is a test function and takes two arguments for comparing:
r - item to be returned
x - comparsion item

9. Thanks Grrr - as for a generic function, consider the following:
Code:
(defun extremum ( cmp lst / rtn )
(setq rtn (car lst))
(foreach itm (cdr lst)
(if (apply cmp (list itm rtn)) (setq rtn itm))
)
rtn
)
Code:
_\$ (extremum '< '(3 8 9 1 5 6 2 7))
1
Code:
_\$ (extremum '(lambda ( a b ) (< (caddr a) (caddr b))) '((1.2 5.7 8.3) (9.4 2.6 0.3) (5.7 6.6 7.2)))
(9.4 2.6 0.3)

10. Registered forum members do not see this ad.

Or recursively:
Code:
(defun extremum ( cmp lst )
(   (lambda ( foo ) (if (cdr lst) (foo (car lst) (extremum cmp (cdr lst))) (car lst)))
(lambda ( a b ) (if (apply cmp (list a b)) a b))
)
)

#### Posting Permissions

• You may not post new threads
• You may not post replies
• You may not post attachments
• You may not edit your posts