Le problème se réduit à cette question : Est-ce que deux lignes de A à B et de C à D se croisent ? On peut alors la poser quatre fois (entre la ligne et chacun des quatre côtés du rectangle).
Voici les mathématiques vectorielles pour le faire. Je suppose que la ligne de A à B est la ligne en question et que la ligne de C à D est l'une des lignes du rectangle. Ma notation est la suivante Ax
est la "coordonnée x de A" et Cy
est la "coordonnée y de C". Et " *
" signifie produit scalaire, donc par exemple A*B = Ax*Bx + Ay*By
.
E = B-A = ( Bx-Ax, By-Ay )
F = D-C = ( Dx-Cx, Dy-Cy )
P = ( -Ey, Ex )
h = ( (A-C) * P ) / ( F * P )
Ce site h
Le numéro est la clé. Si h
est entre 0
y 1
les lignes se croisent, sinon elles ne se croisent pas. Si F*P
est égal à zéro, vous ne pouvez bien sûr pas faire le calcul, mais dans ce cas, les lignes sont parallèles et ne se croisent donc que dans les cas évidents.
Le point exact d'intersection est C + F*h
.
Plus de plaisir :
Si h
es exactement 0
o 1
les lignes se touchent à un point final. Vous pouvez considérer ce point comme une "intersection" ou non, comme bon vous semble.
Plus précisément, h
est le nombre de fois que vous devez multiplier la longueur de la ligne afin de toucher exactement l'autre ligne.
Par conséquent, si h<0
cela signifie que la ligne du rectangle est "derrière" la ligne donnée (la "direction" étant "de A à B"), et si h>1
la ligne du rectangle est "devant" la ligne donnée.
Dérivation :
A et C sont des vecteurs qui pointent vers le début de la ligne ; E et F sont les vecteurs des extrémités de A et C qui forment la ligne.
Pour toute paire de lignes non parallèles dans le plan, il doit y avoir exactement une paire de scalaires. g
y h
de sorte que cette équation tienne :
A + E*g = C + F*h
Pourquoi ? Parce que deux lignes non parallèles doivent se croiser, ce qui signifie que vous pouvez mettre à l'échelle les deux lignes d'une certaine quantité chacune et les faire se toucher.
( Au premier abord, cela ressemble à une seule équation avec deux inconnues ! Mais ce n'est pas le cas si l'on considère qu'il s'agit d'une équation vectorielle en 2D, ce qui signifie qu'il s'agit en réalité d'une paire d'équations en x
y y
.)
Nous devons éliminer une de ces variables. Un moyen facile est de rendre la E
terme zéro. Pour cela, il faut prendre le produit scalaire des deux côtés de l'équation en utilisant un vecteur dont le point est nul avec E. Ce vecteur est appelé P
ci-dessus, et j'ai fait la transformation évidente de E.
Vous avez maintenant :
A*P = C*P + F*P*h
(A-C)*P = (F*P)*h
( (A-C)*P ) / (F*P) = h
0 votes
Il peut être utile de considérer les bords du rectangle comme des lignes distinctes plutôt que comme un polygone complet.
0 votes
Note du modérateur la discussion sur la question de savoir si ce post est ou non sur le sujet appartient à Méta Stack Overflow Tout autre commentaire à ce sujet sera supprimé.