Newsgroup: it.comp.lang.visual-basic
Titolo: RICHIESTA DI AIUTO: Linea retta e intersezioni

AIUTO:
sto scrivendo un prg in VB4 che mi serve per la sbrogliatura di
circuiti stampati.
Questo programma funziona esclusivamente con vettori e punti.
Il mio problema e' quello di creare un algoritmo matematico che usato
piu' volte mi risolva questo problema :
 - avendo una retta con punti conosciuti Xa,Ya,Xb,Yb e un'altra con
punti conosciuti Xc,Yc,Xd,Yd devo determinare se c'e' una intersezione
o la minima distanza tra di loro.
 - avendo una retta con punti conosciuti Xa,Ya,Xb,Yb e un punto
definito Xz,Yz devo determinare la distanza minima e una eventuale
intersezione.
Tutto questo mi servirebbe in codice VB da eseguire molte volte quindi
con un codice ottimizzato.
Se qualcuno e' a conoscienza di una soluzione o di qualche sito dove
poter guardare per poter risolvere tutto cio', sia lodato !!!!!
Grazie da paul_pollo, un programmatore sull'orlo di una crisi di
nervi.

con un codice ottimizzato.
Ti posso dare un algoritmo che risolve il tuo primo problema .. io lo ho
usato in c++ non dovrebbero esserci problemi a tradurlo in vb4:
int ccw(struct point p0, struct point p1, struct point p2 )
{
  int dx1 ,dx2 , dy1,dy2;
dx1 = p1.x - p0.x;
dy1 = p1.y - p0.y;
dx2 = p2.x - p0.x;
dy2 = p2.y - p0.y;
if (dx1*dy2 > dy1*dx2) return +1;
if (dx1*dy2 < dy1*dx2) return -1;
if ((dx1*dx2 < 0) || (dy1*dy2 < 0 )) return -1;
if ((dx1*dx1+dy1*dy1) < (dx2*dx2+dy2*dy2))   return +1;
return 0;
}
int intersect(struct line l1, struct line l2)
{
return (( ccw(l1.p1 , l1.p2 , l2.p1) * ccw(l1.p1 , l1.p2 , l2.p2)) <= 0) 
&&
(( ccw(l2.p1 , l2.p2 , l1.p1) * ccw(l2.p1 , l2.p2 , l1.p2)) <= 0);
}
La funzione che serve e' instersect a cui si passano i due segmenti che
sono definiti dal punto iniziale e finale ... ritorna true o false a
seconda se si intersecano o meno .
Per quanto riguarda la distanza e' semplice .. visto che immagino che si
tratti di segmenti e non rette bisogna solo calcolare mediante la classica
formula della distanza punto-retta le quattro distanze che ci sono tra 
ogni estremo dei due segmenti  e il segmento opposto ... la distanza minore
e' la distanza tra i due segmenti.
Per il secondo problema non mi e' chiaro che cosa devi fare ....
saluti
.\\assimo

 con un codice ottimizzato.


 
È un problema che mi capita spesso.
Questa è una delle varianti della funzione che uso. La modifico in ogni
programma perché ogni volta ho bisogno di qualcosa di diverso. Per esempio
in questo caso mi pare di ricordare che avevo dei problemi con punti di
coordinate simili ma non uguali.
Vedi un po' se ti fa comodo, sono disponibile per altri chiarimenti
Ciao, Stefano
Function IntersLinLinC(x1 As Double, y1 As Double, x2 As Double, y2 As
Double, x3 As Double, y3 As Double, x4 As Double, y4 As Double, ByRef xi As
Double, ByRef yi As Double) As Boolean
  'calcola il punto di intersezione fra le due linee e ritorna true se
esiste
  Dim x As Double, y As Double
  Dim m1 As Double, c1 As Double
  Dim m2 As Double, c2 As Double
 
  If Abs(x1 - x2) < 0.0001 Then x2 = x1
  If Abs(x1 - x3) < 0.0001 Then x3 = x1
  If Abs(x1 - x4) < 0.0001 Then x4 = x1
  If Abs(x2 - x3) < 0.0001 Then x3 = x2
  If Abs(x2 - x4) < 0.0001 Then x4 = x2
  If Abs(x3 - x4) < 0.0001 Then x4 = x3
  If Abs(y1 - y2) < 0.0001 Then y2 = y1
  If Abs(y1 - y3) < 0.0001 Then y3 = y1
  If Abs(y1 - y4) < 0.0001 Then y4 = y1
  If Abs(y2 - y3) < 0.0001 Then y3 = y2
  If Abs(y2 - y4) < 0.0001 Then y4 = y2
  If Abs(y3 - y4) < 0.0001 Then y4 = y3
 
  If x1 = x2 And y3 = y4 Then
    If (x1 < x3 And x1 < x4) Or (x1 > x3 And x1 > x4) Then Exit Function
    If (y3 < y1 And y3 < y2) Or (y3 > y1 And y3 > y2) Then Exit Function
    xi = x1
    yi = y3
    IntersLinLinC = True
    Exit Function
  End If
 
  If x3 = x4 And y1 = y2 Then
    If (x3 < x1 And x3 < x2) Or (x3 > x1 And x3 > x2) Then Exit Function
    If (y1 < y3 And y1 < y4) Or (y1 > y3 And y1 > y4) Then Exit Function
    xi = x3
    yi = y1
    IntersLinLinC = True
    Exit Function
  End If
 
  If x1 = x2 Then
    If x3 = x4 Then Exit Function
    y = y3 + (y4 - y3) / (x4 - x3) * (x1 - x3)
    If (y < y3 And y < y4) Or (y > y3 And y > y4) Then Exit Function
    If (y < y1 And y < y2) Or (y > y1 And y > y2) Then Exit Function
    xi = x1
    yi = y
    IntersLinLinC = True
    Exit Function
  End If
 
  If y1 = y2 Then
    If y3 = y4 Then Exit Function
    x = x3 + (x4 - x3) / (y4 - y3) * (y1 - y3)
    If (x < x3 And x < x4) Or (x > x3 And x > x4) Then Exit Function
    If (x < x1 And x < x2) Or (x > x1 And x > x2) Then Exit Function
    xi = x
    yi = y1
    IntersLinLinC = True
    Exit Function
  End If
 
  If x3 = x4 Then
    If x1 = x2 Then Exit Function
    y = y1 + (y2 - y1) / (x2 - x1) * (x3 - x1)
    If (y < y1 And y < y2) Or (y > y1 And y > y2) Then Exit Function
    If (y < y3 And y < y4) Or (y > y3 And y > y4) Then Exit Function
    xi = x3
    yi = y
    IntersLinLinC = True
    Exit Function
  End If
 
  If y3 = y4 Then
    If y1 = y2 Then Exit Function
    x = x1 + (x2 - x1) / (y2 - y1) * (y3 - y1)
    If (x < x1 And x < x2) Or (x > x1 And x > x2) Then Exit Function
    If (x < x3 And x < x4) Or (x > x3 And x > x4) Then Exit Function
    xi = x
    yi = y3
    IntersLinLinC = True
    Exit Function
  End If
 
  m1 = (y2 - y1) / (x2 - x1)
  c1 = y1 - x1 * m1
 
  m2 = (y4 - y3) / (x4 - x3)
  c2 = y3 - x3 * m2
 
  If m1 = m2 Then Exit Function
 
  x = (c2 - c1) / (m1 - m2)
 
  If (x < x1 And x < x2) Or (x > x1 And x > x2) Then Exit Function
  If (x < x3 And x < x4) Or (x > x3 And x > x4) Then Exit Function
 
  xi = x
  yi = m1 * x + c1
  IntersLinLinC = True
End Function

