Trouver des intersections entre la ligne et le cercle.
k = abs((b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1));
[~,idx] = sort(k);
scatter(b(idx(1:2),2), b(idx(1:2),1))
Ceci est une méthode simple. Il capture tous les points du cercle et vérifie chacun d'eux par rapport au line equation.
Idéalement, nous avons (x-x1)/(x2-x1) = (y-y1)/(y2-y1)
, ou dites d = (x-x1)/(x2-x1) - (y-y1)/(y2-y1)
puis d=0
est la situation idéale. Lorsque le point s'écarte de la ligne, d
augmente en valeur absolue. Par conséquent, le plus petit d
fait référence au point le plus proche de la ligne. Dans ce cas, il devrait y avoir deux points, donc je cherche les deux plus petites valeurs.
Un problème possible pourrait être la précision. Lorsque les points sur le cercle sont éloignés l'un de l'autre, il est possible que les deux points les plus proches se trouvent au même point d'intersection, laissant l'autre non détecté. Un contrôle plus compliqué s'appliquerait, par exemple choisir les quatre plus proches et ensuite distinguer. Cependant, vous pouvez éviter cela en conservant une densité de points élevée.
EDIT: ajouté une telle vérification.
k = abs((b(:,2)-x1) * (y2-y1) - (b(:,1)-y1) * (x2-x1));
[~,idx] = sort(k);
f4x = b(idx(1:4),2);
f4y = b(idx(1:4),1);
choose = [1,2;1,3;1,4;2,3;2,4;3,4];
dist = sqrt((f4x(choose(:,1))-f4x(choose(:,2))).^2 + ....
(f4y(choose(:,1))-f4y(choose(:,2))).^2);
[~, idx2] = sort(dist,'descend');
px = b(idx(choose(idx2(1,:),:).'),2);
py = b(idx(choose(idx2(1,:),:).'),1);
scatter(px, py)
Quelques résultats
>> idx(1:4)
ans =
28
112
113
29
>> dist
dist =
55.7853
55.5428
1.0000
1.0000
55.5428
55.3173
est-il un moyen de le rendre plus sensible? par exemple en ajoutant une distance entre tous ces points – hsi
@ user2676173 Oui, vous pouvez ajouter une vérification de la distance relative entre chacun des quatre premiers points. Recherchez la première paire de deux une distance distincte à part. – Yvon
Est-il possible de remplacer le scatter par l'impoint? – user2916044