j2lstaples Posted July 14 Share Posted July 14 It's intuitive to know that 90 degrees and 270 degrees are collinear assuming the same reference point and 0 degrees. It gets harder to test for other angles though. This gets even more frustrating to test if your angle is negative, or more than 2*pi in radians. ;********************************************************; ;; MA:str8_ang - Check if two angles are straight (collinear) ;; Arguments: ;; - ang1 (float): First angle in radians ;; - ang2 (float): Second angle in radians ;; Returns: ;; - test (bool): True if the angles are collinear, False otherwise ;; Description: ;; This function checks if two angles are collinear (straight) by calculating the cross product of their corresponding unit vectors. ;; The provided angles are translated to positive equivalents and normalized to the range of 0 to 2π. ;; The function then calculates the unit vectors u and v from the angles and calculates their cross product. ;; If the cross product is nearly zero (within a tolerance), the angles are considered collinear. ;; The function returns True if the angles are collinear, and False otherwise. ;; Usage: (MA:str8_ang ang1 ang2) (defun MA:str8_ang (ang1 ang2 / u1 u2 u3 v1 v2 v3 cross_prod test) (if (and ang1 ang2) (progn ;; Translate negative angles to positive equivalents (if (< ang1 0) (setq ang1 (+ (* 2 pi) (rem ang1 (- (* 2 pi))))) ) (if (< ang2 0) (setq ang2 (+ (* 2 pi) (rem ang2 (- (* 2 pi))))) ) ;; Normalize angles to the range of 0 to 2π (setq ang1 (rem ang1 (* 2 pi))) (setq ang2 (rem ang2 (* 2 pi))) (setq u1 (cos ang1) u2 (sin ang1) u3 0.0 v1 (cos ang2) v2 (sin ang2) v3 0.0 ) (setq cross_prod (list (- (* u2 v3) (* u3 v2)) (- (* u3 v1) (* u1 v3)) (- (* u1 v2) (* u2 v1)) ) ) (if (and (= (car cross_prod) 0.0) (= (cadr cross_prod) 0.0) (< (abs (caddr cross_prod)) 0.005) ) (setq test T) (setq test nil) ) test ; return the test result ) ; end progn ) ; end if ) This basically outputs T if the two angles have the same angle or reflection of each other. Do you guys have an easier way of checking this? A refactor would be nice. Quote Link to comment Share on other sites More sharing options...

Tsuky Posted July 16 Share Posted July 16 And from polyface.de ? Exemple: ;;functions VectorProduct & collinear ;;Armin Antkowiak, Berlin ;;http://www.polyface.de/general.html ;;mailto:info@polyface.de (defun vectorProduct (v1 v2 / ) (list (- (* (cadr v1) (caddr v2)) (* (caddr v1) (cadr v2))) (- (* (caddr v1) (car v2)) (* (car v1) (caddr v2))) (- (* (car v1) (cadr v2)) (* (cadr v1) (car v2))) ) ) (defun collinear (p1 p2 p3 p4 / tol) (setq tol 1E-12) (equal '(0.0 0.0 0.0) (vectorProduct (mapcar '- p2 p1) (mapcar '- p3 p4)) tol ) ) ;********************************* (defun c:colineaire ( / e1 e2 pt1 pt2 pt3 pt4) (setq e1 (entget (car (entsel "\nSelect first line: ")))) (setq e2 (entget (car (entsel "\nSelect second line: ")))) (setq pt1 (cdr (assoc 10 e1)) pt2 (cdr (assoc 11 e1)) pt3 (cdr (assoc 10 e2)) pt4 (cdr (assoc 11 e2)) ) (if (collinear pt1 pt2 pt3 pt4) (princ "\nLine are collinear") (princ "\nLine aren't collinear") ) (princ) ) Quote Link to comment Share on other sites More sharing options...

marko_ribar Posted July 16 Share Posted July 16 (edited) (defun collinear-p ( p1 p p2 ) (equal (distance p1 p2) (+ (distance p1 p) (distance p p2)) 1e-6) ) ;; Collinear-p - Lee Mac ;; Returns T if p1,p2,p3 are collinear (defun LM:Collinear-p ( p1 p2 p3 ) ( (lambda ( a b c ) (or (equal (+ a b) c 1e-8) (equal (+ b c) a 1e-8) (equal (+ c a) b 1e-8) ) ) (distance p1 p2) (distance p2 p3) (distance p1 p3) ) ) Edited July 17 by marko_ribar Quote Link to comment Share on other sites More sharing options...

j2lstaples Posted July 31 Author Share Posted July 31 On 7/16/2023 at 6:31 AM, Tsuky said: And from polyface.de ? I don't even know that website. Nobody owns Linear Algebra afaik. Maybe I should get some good code from there as well. Seems neat and nice. Thanks for sharing. Quote Link to comment Share on other sites More sharing options...

## Recommended Posts

## Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Note:Your post will require moderator approval before it will be visible.