Code Red > AutoLISP (Vanilla / Visual)

C++ to lisp

<< < (5/6) > >>

pedroantonio124:
Thanks  :-D

This was the mistake in the Lisp code
It now works  :lol: :-P ^-^ :laugh: :blank:


--- Code: ---Incorrect: (setq eps (* a (1-  (/ epsi 3.0)))))
OK: (setq eps (* a (- 1 (/ epsi 3.0)))))

--- End code ---

pedroantonio124:
Thanks to irneb and Kerry  :-)

example:
(utm2latlong 451602.19 4519076.99 "33N")
->40.821287°  14.426080°

PedroAntonio  :evil: :-P



--- Code: ---(defun utm2latlong (utmX utmY utmZone / latitude longitude isNorthHemisphere diflat diflon zone c_sa
c_sb e2 e2cuadrada c x y s lat v a a1 a2 j2 j4 j6 alfa beta gama bm b
epsi eps nab senoheps delta tao longitude latitude)

(defun tan (x / c)
(if (= (setq c (cos x)) 0.0)
(* (if (< x 0) -1 1) 1.7976931348623158e+308) ;Closest we can get to infinity using a double floating point
(/ (sin x) c)
)
)

(setq LATLONG nil)
(setq isNorthHemisphere (wcmatch utmZone "*[Nn]"))
(setq diflat -0.00066286966871111111111111111111111111)
(setq diflon -0.0003868060578)
(setq zone (atoi (substr utmZone 1 (1- (strlen utmZone)))))
(setq c_sa 6378137.0)
(setq c_sb 6356752.314245)
(setq e2 (/ (expt (- (expt c_sa 2.0) (expt c_sb 2.0)) 0.5) c_sb))    
(setq e2cuadrada (expt e2 2.0))
(setq c (/ (expt c_sa 2.0) c_sb))
(setq x (- utmX 500000))
(setq y (if isNorthHemisphere utmY (- utmY 10000000)))
(setq s (- (* zone 6.0) 183.0))
(setq lat (/ y (* 6366197.724 0.9996)))
(setq v (* (/ c (expt (+ 1 (* e2cuadrada (expt (cos lat) 2) )) 0.5) ) 0.9996))
(setq a (/ x v))
(setq a1 (sin (* 2.0 lat)))
(setq a2 (* a1 (expt (cos lat) 2.0)))
(setq j2 (+ lat (/ a1 2.0)))
(setq j4 (/ (+ (* 3.0 j2) a2) 4.0))
(setq j6 (/ (+ (* 5.0 j4) (* a2 (expt (cos lat) 2.0))) 3.0))
(setq alfa (* (/ 3.0 4.0) e2cuadrada))
(setq beta (* (/ 5.0 3.0) (expt alfa 2.0)))     
(setq gama (* (/ 35.0 27.0) (expt alfa 3.0)))
(setq bm (* 0.9996 c (- (+ (- lat (* alfa j2)) (* beta j4)) (* gama j6))))
(setq b (/ (- y bm) v))       
(setq epsi (* (/ (* e2cuadrada (expt a 2.0)) 2.0) (expt (cos lat) 2.0)))
(setq eps (* a (- 1 (/ epsi 3.0))))   
(setq nab (+ (* b (- 1 epsi)) lat))
(setq senoheps (/ (- (exp eps) (exp (- eps))) 2.0))
(setq delt (atan (/ senoheps (cos nab))))
(setq tao (atan (* (cos delt) (tan nab))))     
(setq longitude (+ (* (/ delt pi) 180.0) s))
(setq latitude (* (/ (+ lat (* (- (+ 1 (* e2cuadrada (expt (cos lat) 2.0))) (* (/ 3.0  2.0) e2cuadrada (sin lat) (cos lat) (- tao lat))) (- tao lat))) pi) 180.0))
   
(setq LATLONG (list latitude longitude ))
LATLONG
(princ)
)

--- End code ---

mailmaverick:

--- Quote from: pedroantonio124 on December 08, 2014, 10:45:05 AM ---Thanks to irneb and Kerry  :-)

example:
(utm2latlong 451602.19 4519076.99 "33N")
->40.821287°  14.426080°

PedroAntonio  :evil: :-P



--- Code: ---(defun utm2latlong (utmX utmY utmZone / latitude longitude isNorthHemisphere diflat diflon zone c_sa
c_sb e2 e2cuadrada c x y s lat v a a1 a2 j2 j4 j6 alfa beta gama bm b
epsi eps nab senoheps delta tao longitude latitude)

(defun tan (x / c)
(if (= (setq c (cos x)) 0.0)
(* (if (< x 0) -1 1) 1.7976931348623158e+308) ;Closest we can get to infinity using a double floating point
(/ (sin x) c)
)
)

(setq LATLONG nil)
(setq isNorthHemisphere (wcmatch utmZone "*[Nn]"))
(setq diflat -0.00066286966871111111111111111111111111)
(setq diflon -0.0003868060578)
(setq zone (atoi (substr utmZone 1 (1- (strlen utmZone)))))
(setq c_sa 6378137.0)
(setq c_sb 6356752.314245)
(setq e2 (/ (expt (- (expt c_sa 2.0) (expt c_sb 2.0)) 0.5) c_sb))    
(setq e2cuadrada (expt e2 2.0))
(setq c (/ (expt c_sa 2.0) c_sb))
(setq x (- utmX 500000))
(setq y (if isNorthHemisphere utmY (- utmY 10000000)))
(setq s (- (* zone 6.0) 183.0))
(setq lat (/ y (* 6366197.724 0.9996)))
(setq v (* (/ c (expt (+ 1 (* e2cuadrada (expt (cos lat) 2) )) 0.5) ) 0.9996))
(setq a (/ x v))
(setq a1 (sin (* 2.0 lat)))
(setq a2 (* a1 (expt (cos lat) 2.0)))
(setq j2 (+ lat (/ a1 2.0)))
(setq j4 (/ (+ (* 3.0 j2) a2) 4.0))
(setq j6 (/ (+ (* 5.0 j4) (* a2 (expt (cos lat) 2.0))) 3.0))
(setq alfa (* (/ 3.0 4.0) e2cuadrada))
(setq beta (* (/ 5.0 3.0) (expt alfa 2.0)))     
(setq gama (* (/ 35.0 27.0) (expt alfa 3.0)))
(setq bm (* 0.9996 c (- (+ (- lat (* alfa j2)) (* beta j4)) (* gama j6))))
(setq b (/ (- y bm) v))       
(setq epsi (* (/ (* e2cuadrada (expt a 2.0)) 2.0) (expt (cos lat) 2.0)))
(setq eps (* a (- 1 (/ epsi 3.0))))   
(setq nab (+ (* b (- 1 epsi)) lat))
(setq senoheps (/ (- (exp eps) (exp (- eps))) 2.0))
(setq delt (atan (/ senoheps (cos nab))))
(setq tao (atan (* (cos delt) (tan nab))))     
(setq longitude (+ (* (/ delt pi) 180.0) s))
(setq latitude (* (/ (+ lat (* (- (+ 1 (* e2cuadrada (expt (cos lat) 2.0))) (* (/ 3.0  2.0) e2cuadrada (sin lat) (cos lat) (- tao lat))) (- tao lat))) pi) 180.0))
   
(setq LATLONG (list latitude longitude ))
LATLONG
(princ)
)

--- End code ---

--- End quote ---

Dear Pedro,

Excellent LISP. Works great. Do you have reverse LISP i.e. to convert Lat , Long to UTM Coordinates ?

d2010:
You convert  huge math equations to autolisp -R14
You can convert 9999-maths-equations to autolispR14..full automatically.
Please you see details at.
Step1) You downloading the compilator
Step2) You insert  your math  equatiosn into file. ,Vlax as .Zip
Step3) You compile then vlax.
Allea gutes..

http://lisp2arx.3xforum.ro/post/19/1/VirtualC_Lisp/

http://www.puiubrat.3x.ro/adve2011/netilisq.html

Mark:

--- Quote from: Kerry on December 08, 2014, 05:36:07 AM ---You want fries with this ?

--- End quote ---
Damn. Nice visual too. :)

You guys amaze me.

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version