Newsgroup: it.discussioni.geometri
Titolo: [un po' OT] GEOMETRIA = Chi mi aiuta?

Salve, sono bambino di nome Duilio, provengo da Australia e vendo gru +
carro ponte di bruchlin usati a vero affare unico per tutti voi che residete
in Italia di amici nostri che ci voliamo bbbene! :-)
LOL
(evabbè.. oggi ho malditesta... occorre prenderla allegra, la giornata!) :-)
Parliamo di "equazione della retta".
NON mi ricordo PIU' una mazza (lo so, è una vergogna... ma... che ci volete
fare.. uno che oltrepassa i 40 e non usa 'ste robe da anni... eccheccazz...
come fa a ricordarsi tutto?!?) :-)
Hemm...  Diciamo... è un po' OT... ma so che (per esperienza diretta e...
anche corporativismo) eheheheh... .. hemm.... che i Geo sono più bravi di
tutti! :-))
In sostanza, sto scrivendo (finalmente ho ripreso!) un programmino in VB,
per il ProgeCAD (ex IntelliCAD, tanto per capirci). E mi serve una mano per
capire why 'sta santissima equazione + una funzione da me creata, non mi
restituiscono (con estrema precisione!) le coordinate di un punto...
A qualcuno interessa l'argomento?
Posso?
..............o mi trasferisco su
"it.matematici.ti.bastoniamo.che.sei-un-ignorante"?
:-D
-- 
Bye
MioMao

 MioMao
Ciao
fulven 

 Posso?
A me sicuramente :-)
Il VB non mi sono mai deciso ad affrontarlo, ma con i lisp (che 
l'IntelliCAD comunque si beve allegramente) mi è già capitato di far 
incrociare equazioni di rette con quelle di cerchi e parabole.
Con tutte le riserve per via di un'anagrafe che anche con me non è molto 
  ben disposta. :-)
Famme sapé
Ciao
Maci

 moglie ....
ehehehehe :-D
Adesso replo anche al Maci... Stay-tuned, così poi vediamo dove sta
l'errore.
Tnk! .-)
-- 
Bye
MioMao

 Famme sapé
Ecchime... :-)
Alura... ho riguardato il tutto e (carta e penna alla mano), sono giunto
alla conclusione che il (mio) problema non sta nell'equazione della retta
per due punti... o nella determinazione dell'intersezione tra due rette (ho
ri-verificato i passaggi.. ed è tutto ok).
Sta nel fatto che sono un SOMARO!! :-D
Per dovere, ve li "incollo" qui sotto (così se trovate qualcosa di storto...
caxxiatemi pure!) :-D
---
Equazione della retta per due punti:
(dal Gasparelli; come riportato dal Fulven)
(y-ya) / (x-xa) = (yb-ya) / (xb-xa)
In VB, la matrice dei coeff. diviene questa:
----------------
Sub rettaper2punti (...... etc...)
    retta(1) = pt1.Y - pt2.Y
    retta(2) = pt2.X - pt1.X
    retta(3) = pt1.X * pt2.Y - pt1.Y * pt2.X
----------------
Ok?
(...e fin qui mi pare tutto ok)
POI... ho scritto questa sub-ettina, che (dati 4 punti, che definiscono due
rette) restituisce la coordinata di intersezione tra le due rette
-------------
Dim denominatore As Double
Dim AA(1 To 3) As Double
Dim BB(1 To 3) As Double
    'coefficenti della retta AA
    Call rettaper2punti(PUNTO1, PUNTO2, AA())
    'coefficenti della retta BB
    Call rettaper2punti(punto3, punto4, BB())
    denominatore = AA(1) * BB(2) - AA(2) * BB(1)
    If denominatore = 0 Then denominatore = 1  'evito il "divide by zero"
    'determina l'intersezione
    intersezio.X = (AA(2) * BB(3) - BB(2) * AA(3)) / denominatore
    intersezio.Y = (AA(3) * BB(1) - AA(1) * BB(3)) / denominatore
------------------------------------
Ok?  Mi pare che -fin qui- sia tutto ok. :-)
QUINDI....
Controlla e ricontrolla...  mi sono accorto che il problema -invece- sta
nella imprecisione di questa routine (chissà cosa avevo in mente, quando la
scrissi!) :-D
---------------------
'restituisce la cordinata polare ad un altra
Sub Polare
Dim PUNTO1 As Point
Dim ANGOLO As Double
Dim LUNGHEZZA As Double
Dim PUNTO2 As Point
    If (Cos(Angolo) * 1E+15) > -1 And (Cos(Angolo) * 1E+15) < 1 Then
        PUNTO2.X = PUNTO1.X
        Else
            PUNTO2.X = PUNTO1.X + (lunghezza * Cos(Angolo))
    End If
    If (Sin(Angolo) * 1E+15) > -1 And (Sin(Angolo) * 1E+15) < 1 Then
        PUNTO2.Y = PUNTO1.Y
        Else
            PUNTO2.Y = PUNTO1.Y + (lunghezza * Sin(Angolo))
    End If
End Sub
---------------------
Ma caspita.. quel controllo (If) sul valore di Cos e Sin "prossimi allo
zero".. .è sbagliato (non l'ho verificato.. ma mi sto ancora domandando per
quale motivo lo scrissi così!) :-\
Quindi (a naso) questa qui sotto (semplificata così) dovrebbe eludere il
problema di imprecisione...
---------------------
PUNTO2.X = PUNTO1.X + (lunghezza * Cos(Angolo))
PUNTO2.Y = PUNTO1.Y + (lunghezza * Sin(Angolo))
---------------------
Boh....
.....ma che vergogna.....  8-O
.........chissà cosa avevo in mente....  LOL :-D
Sono sorry...  VI devo una birra! :-DD
--
Bye
MioMao

 ---------------------
Se l'hai scritta così probabilmente avevi riscontrato qualche problema: 
apparentemente sembrerebbe inutile dato che con cos () che si approssima 
a zero anche lung * cos () tende ad annullarsi.
Devo anche dire che secondo me poteva essere meglio qualcosa del tipo:
      If (Cos(Angolo) * 1E+15) < -1 Or (Cos(Angolo) * 1E+15) > 1 Then
non è propriamente la stessa cosa in quanto la tua expr corregge i 
valori compresi tra -1E-15 a +1E-15, ma non quelli ancora più piccoli
Forse ;-)
Ciaooooo
Maci

 
Ho cannato, ho cannato, maledizione :-(
Com'è la funzione che calcola il valore assoluto in VB? Diciamo Abs ()?
Allora più semplicemente sarebbe
       If (Abs (Cos(Angolo)) * 1E+15) < 1 Then
Meglio ?
Ciao
Maci

 Meglio ?
Ok.. ma... a cosa serve? :-)
A mio avviso, senza quella correzione, il dato risultante è appropriato.
Invece, con quella correzione, per angoli molto stretti (acuti), commette
errore, perchè impone un dato arbitrariamente (cord. X o cord.Y)
Nel mio caso, dato un punto certo (con il mouse, una intersezione tra due
linee)... quindi fissando due nuovi punti con POLAR passanti per
l'intersezione data.... 'spetta... mi spiego meglio così ((parliamoci in
Lisp, che ci capiamo prima).... e spero di ricordami come si fa!)
;tocco una linea
(setq ent1 (entsel "\nSeleziona la linea: ")
    ent1 (entget (car ent1))
;prelevo le coordinate che la definiscono
    pt_start (cdr (assoc 10 ent1))
    pt_end (cdr (assoc 11 ent1))
;determino la direzione
    angolo (angle pt_start pt_end)
;tocco una intersezione, sulla stessa linea
    pt_intersezione (getpoint: "\nTocca l'intersezione sulla stessa linea:
")
;determino due punti, allineati con l'intersezione
    pt_nuovo01 (polar pt_intersezione (+ (/ pi 2.0) angolo) 100)
    pt_nuovo02 (polar pt_intersezione (- (/ pi 2.0) angolo) 100))
quei due punti li sopra, definiscono una retta passante per l'intersezione
(gisuto?)
A questo punto (in VB) trovandomi in questa situazione, se applico
l'equazione della retta (pt_nuovo01 -- pt_nuovo02) e la Sub che calcola
l'intersezione, il programma NON restituisce le coordinate precise (!)
dell'intersezione (pt_intersezione).
Ha un margine di errore miserrimo (tipo... al ventesimo numero decimale)...
ma c'è!
Controllando l'eq della retta per due punti e la determinazione
dell'intersezione, mi sono accorto che i dati (introdotti a mano), tornano
perfettamente.
Quindi... ho ritenuto che l'errore stia nella Sub relativa alla
determinazione delle coordinate polari (probabilmente mi "sposta" di un
inezia la retta.. la quale NON passa più per l'intersezione)... e il
sospetto è che l'errore stia proprio nell'approssimazione (allo zero) della
condione IF su Coseno e Seno.
Che senso ha "approssimare" se il Cos(angolo) -o Sin(angolo)- è prossimo a
zero? (non me lo spiego nemmeno io... che l'ho scritto! Ripeto: chissà cosa
avevo in mente..) :-D
L'istruzione IF impone che (nel caso Cos(angolo) sia prossimo allo zero), la
cordinata X del punto da calcolare, sia uguale a quella della retta data.
Cosa analoga per Sin(angolo), dove impone ugualmente la cordinata Y.
Ora (ho un altro sospetto), dato che tale condizione interviene solo se gli
angoli sono similari a 0, 90 e compagnia bella.. non mi spiego perchè da
errore in presenza di altri angoli (dove Cos(angolo) e Sin(angolo) sono <>
da zero). :-)
Non so se mi sono capito... :-)
--
Bye
MioMao

       ** Ciao Maci
Ma perché non vi scrivete in pvt.!?
-- 
Ciao

 
oooops! Disturbiamo?
Non pensavo.
Comunque adesso vi lasciamo in pace :-))
x MioMao
riciclo il tuo indirizzo pvt che hai postato qualche giorno fa.
Ciao
Maci