Re: Applicazione (forse) del teorema di Menelao

Messaggioda Giovanni Anzani » 02/02/2024, 21:23

ah ok grazie mi era sfuggita la correlazione tra
b*b-a*c <-> 0 triangoli
lo stavo anche cercando amano... :-)

ora riguardo tutto grazie.
Giovanni Anzani
Starting Member
Starting Member
 
Messaggio: 10 di 12
Iscritto il: 26/01/2024, 23:16

Re: Applicazione (forse) del teorema di Menelao

Messaggioda Giovanni Anzani » 02/02/2024, 23:15

grazie mille sellacollesella si sto revisionando il tutto e modificando il codice, a questo punto mi pare molto completo, se finisco stanotte carico il codice finale, più facile domattina.
Giovanni Anzani
Starting Member
Starting Member
 
Messaggio: 11 di 12
Iscritto il: 26/01/2024, 23:16

Re: Applicazione (forse) del teorema di Menelao

Messaggioda Giovanni Anzani » 03/02/2024, 16:46

gentilissimo sellacollesella,
come sempre grazie mille, mi piacerebbe trovare il modo di ricambiare quanto hai fatto, ti avevo scritto un messaggio privato, non so se l'hai visto con i miei contatti.
mi pare tutto ok, allego qualche immagine di test e l'algoritmo in AutoLisp completo di feedback sia geometrico che analitico di quanto calcolato passo passo, dicevi che AutoCAD non ti e' nuovo, se vuoi puoi provarlo anche te.
Per altre cose avevo usato una variabile *0.0* pari a 1e-8 (come per la coincidenza di due punti, che trovi inserita ma non usata) ma per ora mi pare che i due predicati zerop e minusp funzionino, pr questo non ho accolto il tuo suggerimento all'uso della tolleranza, certo forse devo trovare la situazione specifica per mettere in crisi l'algoritmo.

seguono un esempio di feedback del programma, alcune immagini e il codice:

---------------------------------------------------------------------
dati della retta n
Punto A: (195461.0 105518.0 0.0)
Punto B: (200333.0 106205.0 0.0)
Punto C: (212651.0 107944.0 0.0)
---------------------------------------------------------------------
dati della circonferenza alfa
Punto D: (192663.0 86855.8 0.0)
Punto H: (186607.0 96579.7 0.0)
raggio r:11455.3
---------------------------------------------------------------------
verifiche geometriche
---------------------------------------------------------------------
i tre punti ABC sono allineati su una retta n
nell'allineamento su n il punto B è interno ai punti A C
il punto A è esterno alla circonferenza alfa
il punto B è esterno alla circonferenza alfa
il punto C è esterno alla circonferenza alfa
la retta n è esterna alla circonferenza alfa
---------------------------------------------------------------------
verifiche analitiche
---------------------------------------------------------------------
calcolo dei parametri a b c s = (b^2 - a*c)
---------------------------------------------------------------------
parametro a: 2.87061
parametro b: -5.91074
parametro c: 4.70527
parametro s: 21.4299
---------------------------------------------------------------------
s>0 allora tutti e tre i punti A B C sono esterni alla circonferenza
oppure due sono interni e uno è esterno alla circonferenza;
i due triangoli EFG non sono degeneri ed i loro rispettivi vertici
sono distinti
---------------------------------------------------------------------
calcolo dei parametri e1 f1 g1 e2 f2 g2
---------------------------------------------------------------------
parametro e1: 3.67168 parametro e2: 0.44642
parametro f1: 1.77776 parametro f2: 0.0265043
parametro g1: 1.32212 parametro g2: -0.448862
---------------------------------------------------------------------
calcolo delle coordinate di E1 F1 G1 E2 F2 G2
---------------------------------------------------------------------
punto E1: (182790.0 92664.7 0.0) punto E2: (200311.0 95384.0 0.0)
punto F1: (186714.0 96645.5 0.0) punto F2: (204102.0 87462.6 0.0)
punto G1: (189545.0 97878.6 0.0) punto G2: (200276.0 78296.5 0.0)
---------------------------------------------------------------------


Immagine

Immagine

Immagine

Immagine

Immagine


;SOF
;--------------------------------------------------------
;verifiche geometriche
;--------------------------------------------------------
(defun vettore_2pu (Pu1 Pu2) (mapcar '- Pu2 Pu1))
(defun combine_Pu1_xy_Pu2_z (Pu1 Pu2) (list (car Pu1) (cadr Pu1) (caddr Pu2)))
;--------------------------------------------------------
(defun P_coinc_1Pu_1Pu (Pu1 Pu2) (equal 0.0 (distance Pu1 Pu2) *0.0*))
;--------------------------------------------------------
(defun proiez_1Pu_2Pu (Pu1 Pu2 Pu3 / vett_Pu2_Pu3)
(setq vett_Pu2_Pu3 (vettore_2pu Pu2 Pu3))
(trans (combine_Pu1_xy_Pu2_z (trans Pu2 0 vett_Pu2_Pu3)
(trans Pu1 0 vett_Pu2_Pu3)) vett_Pu2_Pu3 0))
;--------------------------------------------------------
(defun P_allin_3Pu (Pu1 Pu2 Pu3) (P_coinc_1Pu_1Pu Pu1 (proiez_1Pu_2Pu Pu1 Pu2 Pu3)))
;--------------------------------------------------------
(defun CMD-0 () (setq cm_old (getvar "cmdecho" )) (setvar "cmdecho" 0 ))
(defun OSM-0 () (setq os_old (getvar "osmode" )) (setvar "osmode" 0 ))
(defun CMD-P () (setvar "cmdecho" cm_old ))
(defun OSM-P () (setvar "osmode" os_old ))
;--------------------------------------------------------
(defun drawPu (Pu) (CMD-0)(OSM-0) (command "_point" Pu) (OSM-P)(CMD-P))
(defun drawLi (Pu1 Pu2) (CMD-0)(OSM-0) (command "_line" Pu1 Pu2 "") (OSM-P)(CMD-P))
(defun drawXl (Pu1 Pu2) (CMD-0)(OSM-0) (command "_xline" Pu1 Pu2 "") (OSM-P)(CMD-P))
(defun drawTr (Pu1 Pu2 Pu3) (CMD-0)(OSM-0) (command "_pline" Pu1 Pu2 Pu3 "_c") (OSM-P)(CMD-P))
(defun drawCi_cr (Ce ra) (CMD-0)(OSM-0) (command "_circle" Ce ra) (OSM-P)(CMD-P))
(defun drawCi_3P (Pu1 Pu2 Pu3) (CMD-0)(OSM-0) (command "_circle" "_3p" Pu1 Pu2 Pu3) (OSM-P)(CMD-P))
;--------------------------------------------------------
(setq *0.0* 1e-8) ;tolleranza da usare in vari casi (qua ancora non usata)
;--------------------------------------------------------
(defun c:test ()

(setq PE1 nil PF1 nil PG1 nil
PE2 nil PF2 nil PG2 nil)

(princ "\n---------------------------------------------------------------------
\ndati della retta n")
(setq A (getpoint "\nPunto A: ")) (princ A) (drawPu A)
(setq B (getpoint A "\nPunto B: ")) (princ B) (drawPu B) (drawXl A B)
(setq C (getpoint B "\nPunto C: ")) (princ C) (drawPu C) (drawTr A B C)
(princ "\n---------------------------------------------------------------------
\ndati della circonferenza alfa")
(setq D (getpoint "\nPunto D: ")) (princ D) (drawPu D)
(setq H (getpoint D "\nPunto H: ")) (princ H) ;(drawPu H)
(setq r (distance D H)) (princ "\nraggio r:") (princ r) (drawCi_cr D r)

(setq dAB (distance A B) dAD (distance A D)
dAC (distance A C) dBD (distance B D)
dBC (distance B C) dCD (distance C D)
dmax (max dAB dAC dBC)
alli (P_allin_3Pu A B C))

(princ "\n---------------------------------------------------------------------
\nverifiche geometriche
\n---------------------------------------------------------------------")
(princ (strcat "\ni tre punti ABC" (if alli " " " non ") "sono allineati su una retta n"))
(cond ((and alli (equal dAB dmax)) (progn (princ "\nnell'allineamento su n il punto C è interno ai punti A B")))
((and alli (equal dAC dmax)) (progn (princ "\nnell'allineamento su n il punto B è interno ai punti A C")))
((and alli (equal dBC dmax)) (progn (princ "\nnell'allineamento su n il punto A è interno ai punti B C")))
((not alli) (drawCi_3P A B C)))

(princ (strcat "\nil punto A è " (if (< dAD r) "interno""esterno") " alla circonferenza alfa"))
(princ (strcat "\nil punto B è " (if (< dBD r) "interno""esterno") " alla circonferenza alfa"))
(princ (strcat "\nil punto C è " (if (< dCD r) "interno""esterno") " alla circonferenza alfa"))

(setq Ht (proiez_1Pu_2Pu D A B))
(setq rt (distance D Ht))

(cond ((< r rt)(princ "\nla retta n è esterna alla circonferenza alfa"))
((= r rt)(princ "\nla retta n è tangente alla circonferenza alfa"))
((> r rt)(princ "\nla retta n è secante la circonferenza alfa")))

;--------------------------------------------------------

(setq XD (car D) YD (cadr D)
XA (car A) YA (cadr A) UA (/ (- XA XD) r) VA (/ (- YA YD) r) UAp (+ 1 UA) UAm (- 1 UA)
XB (car B) YB (cadr B) UB (/ (- XB XD) r) VB (/ (- YB YD) r) UBp (+ 1 UB) UBm (- 1 UB)
XC (car C) YC (cadr C) UC (/ (- XC XD) r) VC (/ (- YC YD) r) UCp (+ 1 UC) UCm (- 1 UC))

(setq UAB (* UA UB)
UAC (* UA UC)
UBC (* UB UC) VBC (* VB VC))

(setq a (+ (* VA (- (* UBp VC) (* UCp VB))) (* VBC UAp ) (* -1 UAp UBp UCm)))
(setq b (+ (* VA (- 1 UBC VBC)) (* VB (- 1 UAC)) (* -1 VC (- 1 UAB))))
(setq c (+ (* VA (- (* UBm VC) (* UCm VB))) (* VBC UAm ) (* -1 UAm UBm UCp)))
(setq s (- (* b b)(* a c)))

(princ "\n---------------------------------------------------------------------
\nverifiche analitiche
\n---------------------------------------------------------------------
\ncalcolo dei parametri a b c s = (b^2 - a*c)
\n---------------------------------------------------------------------")
(princ "\nparametro a: ") (princ a)
(princ "\nparametro b: ") (princ b)
(princ "\nparametro c: ") (princ c)
(princ "\nparametro s: ") (princ s)
(princ "\n---------------------------------------------------------------------")


(cond ((or (zerop s) ; controlla che s sia 0
(minusp s)) ; controlla che s sia negativa

(progn (if (zerop s) (princ "\ns=0 allora uno dei tre punti A B C appartiene alla circonferenza;
\ni due triangoli EFG sono entrambi degeneri ed i loro rispettivi
\nvertici coincidono con i punti d'intersezione retta-circonferenza;"))
(if (minusp s) (princ "\ns<0 allora tutti e tre i punti A B C sono interni alla circonferenza
\noppure due sono esterni e uno è interno alla circonferenza;
\ni due triangoli EFG sono entrambi degeneri ed i loro rispettivi
\nvertici coincidono con i punti d'intersezione retta-circonferenza"))

(setq a (+ (expt (- UB UA) 2) (expt (- VB VA) 2)))
(setq b (+ (* (- UB UA) UA) (* (- VB VA) VA)))
(setq c (+ (expt UA 2)(expt VA 2) -1))
(setq s (- (* b b)(* a c)))

(princ "\n---------------------------------------------------------------------
\nricalcolo dei parametri a b c s = (b^2 - a*c)
\n---------------------------------------------------------------------")
(princ "\nparametro a: ") (princ a)
(princ "\nparametro b: ") (princ b)
(princ "\nparametro c: ") (princ c)
(princ "\nparametro s: ") (princ s)
(princ "\n---------------------------------------------------------------------")

(setq t1 (/ (+ (* -1 b) (sqrt s)) a) t2 (/ (- (* -1 b) (sqrt s)) a))

(setq XE1 (+ XD (* r (+ UA (* (- UB UA) t1)))) YE1 (+ YD (* r (+ VA (* (- VB VA) t1))))
XF1 (+ XD (* r (+ UA (* (- UB UA) t2)))) YF1 (+ YD (* r (+ VA (* (- VB VA) t2))))
XG1 XF1 YG1 YF1
XE2 XE1 YE2 YE1
XF2 XF1 YF2 YF1
XG2 XG1 YG2 Yg1))

(princ "\n---------------------------------------------------------------------
\ncalcolo dei parametri t1 t2
\n---------------------------------------------------------------------")
(princ "\nparametro t1: ") (princ t1)
(princ "\nparametro t2: ") (princ t2)
(princ "\n---------------------------------------------------------------------"))

((not (zerop a)) ; controlla che a non sia 0

(progn (princ "\ns>0 allora tutti e tre i punti A B C sono esterni alla circonferenza
\noppure due sono interni e uno è esterno alla circonferenza;
\ni due triangoli EFG non sono degeneri ed i loro rispettivi vertici
\nsono distinti")
(if (= r rt) (princ "\nla retta n è tangente alla circonferenza alfa uno dei due triangoli
\ndegenera nel punto di tangenza"))

(setq e1 (/ (+ (* -1 b) (sqrt s)) a) e2 (/ (- (* -1 b) (sqrt s)) a)
f1 (/ (+ UA (* e1 VA) -1) (- (* UAp e1) VA)) f2 (/ (+ UA (* e2 VA) -1) (- (* UAp e2) VA))
g1 (/ (+ UB (* e1 VB) -1) (- (* UBp e1) VB)) g2 (/ (+ UB (* e2 VB) -1) (- (* UBp e2) VB)))

(princ "\n---------------------------------------------------------------------
\ncalcolo dei parametri e1 f1 g1 e2 f2 g2
\n---------------------------------------------------------------------")
(princ "\nparametro e1: ") (princ e1) (princ " parametro e2: ") (princ e2)
(princ "\nparametro f1: ") (princ f1) (princ " parametro f2: ") (princ f2)
(princ "\nparametro g1: ") (princ g1) (princ " parametro g2: ") (princ g2)
(princ "\n---------------------------------------------------------------------")

(setq e1q (expt e1 2) f1q (expt f1 2) g1q (expt g1 2)
e2q (expt e2 2) f2q (expt f2 2) g2q (expt g2 2))

(setq XE1 (+ XD (/ (* r (- 1 e1q)) (+ 1 e1q))) YE1 (+ YD (/ (* 2 r e1) (+ 1 e1q)))
XF1 (+ XD (/ (* r (- 1 f1q)) (+ 1 f1q))) YF1 (+ YD (/ (* 2 r f1) (+ 1 f1q)))
XG1 (+ XD (/ (* r (- 1 g1q)) (+ 1 g1q))) YG1 (+ YD (/ (* 2 r g1) (+ 1 g1q)))

XE2 (+ XD (/ (* r (- 1 e2q)) (+ 1 e2q))) YE2 (+ YD (/ (* 2 r e2) (+ 1 e2q)))
XF2 (+ XD (/ (* r (- 1 f2q)) (+ 1 f2q))) YF2 (+ YD (/ (* 2 r f2) (+ 1 f2q)))
XG2 (+ XD (/ (* r (- 1 g2q)) (+ 1 g2q))) YG2 (+ YD (/ (* 2 r g2) (+ 1 g2q))))))

((zerop a) ; controlla che a sia 0

(progn (princ "\ns>0 allora tutti e tre i punti A B C sono esterni alla circonferenza
\noppure due sono interni e uno è esterno alla circonferenza;
\ni due triangoli EFG non sono degeneri ed i loro rispettivi vertici
\nsono distinti")
(if (= r rt) (princ "\nla retta n è tangente alla circonferenza alfa uno dei due triangoli
\ndegenera nel punto di tangenza"))
(setq e1 (/ c (* -2 b)) e2 0
f1 (/ (+ UA (* e1 VA) -1) (- (* e1 (+ 1 UA)) VA)) f2 (/ VA (+ 1 UA))
g1 (/ (+ UB (* e1 VB) -1) (- (* e1 (+ 1 UB)) VB)) g2 (/ VB (+ 1 UB)))

(princ "\n---------------------------------------------------------------------
\ncalcolo dei parametri e1 f1 g1 e2 f2 g2
\n---------------------------------------------------------------------")
(princ "\nparametro e1: ") (princ e1) (princ " parametro e2: ") (princ e2)
(princ "\nparametro f1: ") (princ f1) (princ " parametro f2: ") (princ f2)
(princ "\nparametro g1: ") (princ g1) (princ " parametro g2: ") (princ g2)
(princ "\n---------------------------------------------------------------------")

(setq e1q (expt e1 2) f1q (expt f1 2) g1q (expt g1 2)
e2q (expt e2 2) f2q (expt f2 2) g2q (expt g2 2))

(setq XE1 (+ XD (/ (* r (- 1 e1q)) (+ 1 e1q))) YE1 (+ YD (/ (* 2 r e1) (+ 1 e1q)))
XF1 (+ XD (/ (* r (- 1 f1q)) (+ 1 f1q))) YF1 (+ YD (/ (* 2 r f1) (+ 1 f1q)))
XG1 (+ XD (/ (* r (- 1 g1q)) (+ 1 g1q))) YG1 (+ YD (/ (* 2 r g1) (+ 1 g1q)))

XE2 (- XD r) YE2 YD
XF2 (+ XD (/ (* r (- 1 f2q)) (+ 1 f2q))) YF1 (+ YD (/ (* 2 r f2) (+ 1 f2q)))
XG2 (+ XD (/ (* r (- 1 g2q)) (+ 1 g2q))) YG1 (+ YD (/ (* 2 r g2) (+ 1 g2q))))))
(T nil))

(setq PE1 (list XE1 YE1 0.0) PF1 (list XF1 YF1 0.0) PG1 (list XG1 YG1 0.0)
PE2 (list XE2 YE2 0.0) PF2 (list XF2 YF2 0.0) PG2 (list XG2 YG2 0.0))


(princ "\n---------------------------------------------------------------------
\ncalcolo delle coordinate di E1 F1 G1 E2 F2 G2
\n---------------------------------------------------------------------")
(princ "\npunto E1: ") (princ PE1) (princ " punto E2: ") (princ PE2)
(princ "\npunto F1: ") (princ PF1) (princ " punto F2: ") (princ PF2)
(princ "\npunto G1: ") (princ PG1) (princ " punto G2: ") (princ PG2)
(princ "\n---------------------------------------------------------------------")


;---------------------------
(drawTr PE1 PF1 PG1) (drawPu PE1)(drawPu PF1)(drawPu PG1)
(drawTr PE2 PF2 PG2) (drawPu PE2)(drawPu PF2)(drawPu PG2)
)
;---------------------------
;EOF-
Giovanni Anzani
Starting Member
Starting Member
 
Messaggio: 12 di 12
Iscritto il: 26/01/2024, 23:16

Precedente

Torna a Geometria e algebra lineare

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite