2017-10-02 2 views
0

Dans mon programme, j'ai un ensemble de carrés d'échecs dessiné sur le panneau par un objet Graphics (avec chaque objet Square ayant un objet Rectangle qui définit ses limites). Récemment, j'ai ajouté une méthode pour dessiner des lignes sur certains des carrés pour accentuation. Le problème est: je dois pouvoir "effacer" ces lignes et il me semble que le seul moyen d'effacer une ligne est de redessiner les cases "affectées" par la ligne.Comment déterminer si une ligne traverse un rectangle

Je veux demander, en supposant qu'une ligne commence à PointA (x, y) et s'arrête à PointB (x, y), comment puis-je déterminer les carrés sur le panneau à redessiner? Est-il préférable de résoudre chaque ligne en une série de points puis de vérifier quel Square.Rectangle contient l'un des points? Si oui, comment je fais ça?

+0

vous avez déjà les coordonnées des carrés stockées quelque part? –

+1

Copie possible de [Comment savoir si une ligne croise un rectangle] (https://stackoverflow.com/questions/5514366/how-to-know-if-a-line-intersects-a-rectangle) –

+0

Non C# mais https://www.openprocessing.org/sketch/454672 – PrincePolka

Répondre

0

J'imagine que vous auriez besoin de parcourir chacune des lignes (gardez-en un enregistrement) et de déterminer si les lignes se croisent avec les limites supérieure, droite, gauche ou inférieure du rectangle. Vous n'avez pas besoin de faire quoi que ce soit avec les lignes une fois qu'elles sont dessinées, après tout, l'objet ligne contient toutes les informations dont vous auriez besoin pour déduire si la ligne coupe ou non le rectangle. La seule chose que je recommanderais de faire (si ce n'est déjà fait), c'est de stocker les objets dans une collection pour pouvoir les parcourir.

0

Les cellules d'échiquier sont assemblées, vous n'avez donc pas besoin de vérifier toutes les cellules. Juste traverser la ligne et obtenir des cellules touchées. Notez que ce processus diffère légèrement de la pixellisation de ligne.

Vous devez calculer le premier point de début de ligne contenant la cellule, puis obtenir l'intersection des cellules voisines par ligne un par un. Par exemple, si la direction de la ligne est correcte, vérifiez les bords droit et supérieur et ainsi de suite.

Si vous êtes au courant de l'efficacité (grand réseau), pensez algorithme très efficace de Amanatides and Woo