Author Topic: How to calculate mirrored point  (Read 1678 times)

0 Members and 1 Guest are viewing this topic.

bilanšikur

  • Newt
  • Posts: 70
How to calculate mirrored point
« on: October 22, 2012, 02:14:17 PM »
Dear all,

Maybe someone would like to help?

I am trying to create a routine in vlisp that would return the insertion point of a mirrored block, without using the mirror command and without mirroring the block. I just need to know where the mirrored insertionpoint would be. The arguments would be the first point on a mirror line, the second point on a mirror line, the third to select 1 block. It would return something like '(2454.78 951.243 0.0).

My attempt: start with something like (vlax-curve-getClosestPointto obj pnt) and get the closest point on the mirror line calculated from the blocks insertion point. Now I have 2 points, pt1 and pt2. Next I need to calculate the mirrored position; should I go with (polar pnt ang dist)?  Because I have pt1 (block insertionpoint) and pt2 (closest point on curve) I then also have the distance and the angle. I am just stuck how to put it together in short way.

Has this anything to do with matrix calculation? I seen that term often... but never really used any of it.

Anyone got some ideas where to start? Thanks already! Yarik.

BlackBox

  • King Gator
  • Posts: 3757
Re: How to calculate mirrored point
« Reply #1 on: October 22, 2012, 02:44:25 PM »
Wouldn't it be simpler to instead copy the block in place, set the copied block's Visible Property to False, mirror the copied block, extract the insertion point, then delete the block?  :?
"How we think determines what we do, and what we do determines what we get."

bilanšikur

  • Newt
  • Posts: 70
Re: How to calculate mirrored point
« Reply #2 on: October 23, 2012, 01:49:43 AM »
Thank you for the repy. Maybe it would, but that is a cheat.

This would be my code:

Code: [Select]
(defun miPt (/ mlent ent entl nm la pt1 pt2 dist ang pt3)

  (setq mlent (car (entsel "\nSelect mirror line: "))
ent   (car (entsel "\nSelect object:"))
  )
  (setq entl (entget ent))
  (setq pt1 (cdr (assoc 10 entl))
  )

  (setq pt2 (vlax-curve-getClosestPointTo mlent pt1))

  (setq dist (distance pt1 pt2)
ang  (angle pt2 pt1)
  )

  (setq pt3 (polar pt2 (+ ang pi) dist))

)


It returns exactly what I need. Would there be a faster / shorter way?

Stefan

  • Bull Frog
  • Posts: 307
Re: How to calculate mirrored point
« Reply #3 on: October 23, 2012, 03:04:24 AM »
For 2D space
Code - Auto/Visual Lisp: [Select]
  1. (defun mirr_point (p1 p2 b)
  2.  (polar p1 (- (* 2 (angle p1 p2)) (angle p1 b)) (distance p1 b))
  3. )
3D space
Code - Auto/Visual Lisp: [Select]
  1. (defun mirr_point (p1 p2 b)
  2.   ((lambda (p z)
  3.      (list (car p) (cadr p) z)
  4.    )
  5.     (polar p1 (- (* 2 (angle p1 p2)) (angle p1 b)) (distance p1 (list (car b) (cadr b))))
  6.     (caddr b)
  7.   )
  8. )
p1 and p2 - points on mirror line
b - point to be mirrored
« Last Edit: October 23, 2012, 03:07:57 AM by Stefan »

Lee Mac

  • Seagull
  • Posts: 12711
  • London, England
Re: How to calculate mirrored point
« Reply #4 on: October 23, 2012, 07:26:24 AM »
Another, using trans:
Code - Auto/Visual Lisp: [Select]
  1. ;; Reflect  -  Lee Mac
  2. ;; Returns the point obtained by reflecting 'pt' in the axis defined by points p1 & p2.
  3.  
  4. (defun LM:reflect ( pt p1 p2 / ax )
  5.     (setq ax (mapcar '- p1 p2)
  6.           p1 (trans p1 0 ax)
  7.           pt (trans pt 0 ax)
  8.     )
  9.     (trans (cons (- (+ (car p1) (car p1)) (car pt)) (cdr pt)) ax 0)
  10. )

Lee Mac

  • Seagull
  • Posts: 12711
  • London, England
Re: How to calculate mirrored point
« Reply #5 on: October 23, 2012, 07:46:39 AM »
Has this anything to do with matrix calculation? I seen that term often... but never really used any of it.

Consider these old functions if you wish to use a matrix  :-)