Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Dal salotto al giardino, il nuovo proiettore laser di Hisense promette esperienze cinematografiche in qualsiasi contesto: qualità d’immagine, semplicità d’uso, versatilità e prezzo competitivo il suo poker d'assi
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-06-2007, 16:10   #1
x-t
Member
 
Iscritto dal: Sep 2006
Messaggi: 207
Aiutatemi con questo algoritmo, vi prego! Sto esaurendo

Salve a tutti.
Ho qualche problemino con un algoritmo.
Di seguito vi posto il metodo (io l'ho fatto in java, ma ovviamente non è un problema di linguaggio). Questo deve verificare se 2 segmenti si intersecano (il tutto in coordinate cartesiane).
In ingresso prende 2 coppie x, y; ogni coppia rappresenta un segmento.
La funzione deve restituire vero se si intersecano, falso altrimenti.
____________________________________________________
public boolean si_intersecano(double x11,double y11,double x21,double y21,double x12,double y12,double x22,double y22){
//primo segmento
//x11
//y11
//x21
//y21
//secondo segmento
//x12
//y12
//x22
//y22

double a= (y21-y11);
double b=(x11-x21);
double c=x11*(y11-y21)+y11*(x21-x11);//l'equazione ax + by + c=0 rappresenta la retta che contiene il segmento 1, caratterizzato dai punti: (x11,y11) (x21,y21)
double d=(y22-y12);
double e=(x12-x22);
double f=x12*(y12-y22)+y12*(x22-x12);//l'equazione dx + ey + f=0 rappresenta la retta che contiene il secondo segmento, caratterizzato dai punti: (x12,y12) (x22,y22)
double xint=0;//punto di intersezione x
if((a*e-b*d)!=0) xint=(-c*e+b*f)/(a*e-b*d);

double yint=0;//punto di intersezione y
if((a*e-b*d)!=0) yint=(-f*a+c*d)/(a*e-b*d);
if((a*e-b*d)==0 ) return false;
//se le rette sono parallele o sovrapposte ritorno falso,
//so che non è giusto, ma nel mio caso mi va bene



//ora dobbiamo verificare che il punto di intersezione appartenga ad entrambi i segmenti
double maxx1;
double maxy1;
double maxx2;
double maxy2;
double minx1;
double miny1;
double minx2;
double miny2;
if(x11>x21) {maxx1=x11; minx1=x21;} else {maxx1=x21; minx1=x11;}
if(y11>y21) {maxy1=y11; miny1=y21;} else {maxy1=y21; miny1=y11;}
if(x12>x22) {maxx2=x12; minx2=x22;} else {maxx2=x22; minx2=x12;}
if(y12>y22) {maxy2=y12; miny2=y22;} else {maxy2=y22; miny2=y12;}

if (xint<=maxx1 && xint<=maxx2 && xint>=minx1 && xint>=minx2 && yint<=maxy1 && yint<=maxy2 && yint>=miny1 && yint >= miny2) return true;
else return false;
}
__________________________________________________________
Dunque, risolvo un sistema di equazioni in 2 incognite, ottengo l'intersezione, e verifico che l'intersezione appartenga ad entrambi i segmenti.
Eppure, non funziona sempre!
Non capisco proprio dove sia il problema! sto esaurendo!
IMPORTANTE! anche se l'algoritmo considera 2 eventuali segmenti sovrapposti come segmenti che non si intersecano, questo non è importante ai miei fini, perchè nel mio caso è una situazione che non si presenta mai.
Il problema è da qualche altra parte, ma non capisco proprio dove.Aiutooooooooooo
x-t è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 19:33   #2
Perry_Rhodan
Member
 
L'Avatar di Perry_Rhodan
 
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
Forse dico una cagata, nel qual caso scusami, ma non è che entra in gioco l'epsilon di macchina?
Cioè quando si confrontano dei valori double i due numeri potrebbero apparire diversi alla macchina anche se invece dovrebbero essere uguali, semplicemente perchè differiscono per una o più delle cifre meno significative a causa degli errori di arrotondamento.

es:

per la macchina A==B solo se tutti i bit di A e B coincidono

Ma se A e B hanno valori che differiscono di pochissimo tanto da essere praticamente uguali, per il computer continueranno ad essere diversi anche se questa differenza è solo dovuta agli arrotondamenti dei calcoli.

Contando l'epsilon di macchina dovresti avere:

A==B se |A-B|<= epsilon

Scusa se sono stato un po' contorto nella spiegazione
Perry_Rhodan è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 19:53   #3
Perry_Rhodan
Member
 
L'Avatar di Perry_Rhodan
 
Iscritto dal: Jul 2005
Città: Canelli
Messaggi: 158
guarda questa faq java, forse può esserti utile:

http://www.javastaff.com/faq.php#r204
Perry_Rhodan è offline   Rispondi citando il messaggio o parte di esso
Old 27-06-2007, 23:41   #4
x-t
Member
 
Iscritto dal: Sep 2006
Messaggi: 207
ok....tutto risolto....ho trovato un algoritmo già bello e pronto....
Cmq (parlo con Perry_Rhodan), no, il problema non era quello; nel mio codice si trattava solo di trovare un'intersezione e fare delle verifiche di tipo maggiore minore ecc (che non potevano riguardare, nel mio caso, valori così piccoli da poter dare questi problemi)... quindi quei tipi di problemi non potevano presentarsi. Il problema riguardava sicuramente qualche oscura maligna riga di codice scritta male che voleva farmi esaurire.
Se qualcuno, in un futuro remoto, dovesse capitare nel mio stesso problema, può trovare l'algoritmo a questo indirizzo: http://www.cg-cad.com/ttlisp132.htm (non immediato da capire, ma quello che conta è che è funzionale al massimo).
Nel mio caso l'ho portato in java (con le opportune modifiche), e ho cambiato gli int con i double, e tutto ha funzionato alla perfezione! Santo subito chi l'ha messo su internet!
Grazie comunque dell'interessamento Perry_Rhodan !

Ultima modifica di x-t : 27-06-2007 alle 23:47.
x-t è offline   Rispondi citando il messaggio o parte di esso
Old 28-06-2007, 21:54   #5
a2000.1
Senior Member
 
L'Avatar di a2000.1
 
Iscritto dal: Aug 2004
Messaggi: 311
Quote:
Originariamente inviato da x-t Guarda i messaggi
...
Se qualcuno, in un futuro remoto, dovesse capitare nel mio stesso problema, può trovare l'algoritmo a questo indirizzo: http://www.cg-cad.com/ttlisp132.htm (non immediato da capire, ma quello che conta è che è funzionale al massimo).
...
mah
__________________
Senior Member
Registrato il: Jan 2001
Messaggi: 2609
a2000.1 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Tantissima sostanza, batteria da 7000mAh...
Legge sui social in Australia: YouTube i...
100€ di sconto reale, solo 399€ per la P...
Oggi i Macbook Air da 13 pollici con chi...
Meta ruba il futuro dell'AI ad Apple: fu...
Torna a 104€ il robot bestseller Lefant ...
Groq, la startup che vuole sfidare NVIDI...
AMD Ryzen AI Max+: ora anche gli LLM da ...
ChatGPT diventa tutor, addio risposte fa...
Cooler Master MasterFrame 600: modularit...
Questi case sembrano GPU RTX 50 e costan...
Elgato Facecam 4K: ecco la nuova webcam ...
Stampa 3D senza sprechi e senza rifiuti?...
OPPO Find X9 Pro potrebbe battere ogni r...
Le nuove Sony WH-1000XM6 ora disponibili...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:47.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v