Intersection de deux lignes définies dans le paramétrage (rho / thêta)

Vous avez créé une implémentation c ++ de la transformation de Hough pour détecter les lignes dans les images. Les lignes trouvées sont représentées par rho, theta, comme décrit sur wikipedia:

“Le paramètre r représente la distance entre la ligne et l’origine, alors que θ est l’angle du vecteur de l’origine à ce point le plus proche”

Comment puis-je trouver le point d’intersection dans l’espace x, y pour deux lignes décrites à l’aide de r, θ?

Pour référence, voici mes fonctions actuelles pour la conversion vers et depuis l’espace restreint:

//get 'r' (length of a line from pole (corner, 0,0, distance from center) perpendicular to a line intersecting point x,y at a given angle) given the point and the angle (in radians) inline float point2Hough(int x, int y, float theta) { return((((float)x)*cosf(theta))+((float)y)*sinf(theta)); } //get point y for a line at angle theta with a distance from the pole of r intersecting x? bad explanation! >_< inline float hough2Point(int x, int r, float theta) { float y; if(theta!=0) { y=(-cosf(theta)/sinf(theta))*x+((float)r/sinf(theta)); } else { y=(float)r; //wth theta may == 0?! } return(y); } 

désolé d’avance si c’est quelque chose d’évident ..

En regardant la page Wikipedia , je vois que l’équation d’une ligne droite correspondant à une paire donnée de r, θ est

  r = x cosθ + y sinθ 

Ainsi, si je comprends bien, étant donné les deux paires r1, θ1 et r2, θ2, pour trouver l’intersection, vous devez résoudre pour les inconnues x, y le système 2×2 linéaire suivant:

  x cos θ1 + y sin θ1 = r1
 x cos θ2 + y sin θ2 = r2

c’est AX = b, où

  A = [cos θ1 sin θ1] b = | r1 |  X = | x |
     [cos θ2 sin θ2] | r2 |  | y |

N’ayant jamais rencontré de mathématique masortingcielle auparavant, il a donc fallu un peu de recherche et d’expérimentation pour élaborer la procédure pour la réponse de Fredrico. Merci, il fallait quand même en apprendre plus sur les masortingces. ^^

fonction pour trouver où deux lignes paramétrées se croisent:

 //Find point (x,y) where two parameterized lines intersect :p Returns 0 if lines are parallel int paramesortingcIntersect(float r1, float t1, float r2, float t2, int *x, int *y) { float ct1=cosf(t1); //masortingx element a float st1=sinf(t1); //b float ct2=cosf(t2); //c float st2=sinf(t2); //d float d=ct1*st2-st1*ct2; //determinative (rearranged masortingx for inverse) if(d!=0.0f) { *x=(int)((st2*r1-st1*r2)/d); *y=(int)((-ct2*r1+ct1*r2)/d); return(1); } else { //lines are parallel and will NEVER intersect! return(0); } }