Ich habe eine Linie, definiert durch die Parameter m, h
, woWie erhält man die Länge eines Segments, das ein Quadrat kreuzt?
y = m*x + h
Diese Linie über einem Gitter geht (d.h. Pixel). Für jedes Quadrat (a, b)
des Gitters (dh das Quadrat [a, a+1] x [b, b+1]
) möchte ich bestimmen, ob die gegebene Linie dieses Quadrat kreuzt oder nicht, und wenn ja, wie groß ist die Länge des Segments im Quadrat.
Schließlich würde ich gerne in der Lage sein, dies mit mehreren Zeilen auf einmal zu tun (dh m
und h
sind Vektoren, Matlab-Stil), aber wir können uns auf den "einfachen" Fall für jetzt konzentrieren.
Ich stellte dar, wie, um zu bestimmen, ob die Zeile den Platz überquert:
- Compute den Schnittpunkt der Linie mit den vertikalen Linien
x = a
undx = a + 1
und die horizontalen Linieny = b
undy = b + 1
- Prüfen, ob 2 Diese 4 Punkte auf dem Platz Grenzen sind (dh
a <= x < a + 1
undb <= y < b + 1
)
Wenn zwei auf diese Punkte auf dem Platz sind, wird die Linie C wirft es um. Dann, um die Länge zu berechnen, subtrahieren Sie einfach die zwei Punkte und verwenden Pythagoras Theorem.
Mein Problem ist mehr auf der Implementationsseite: wie kann ich das schön implementieren (besonders wenn man auswählt, welche 2 Punkte subtrahiert werden)?
Eine andere Möglichkeit zu überprüfen, ob die Linie das Quadrat kreuzt, ist zu prüfen, ob mindestens ein Paar diagonaler Punkte auf gegenüberliegenden Seiten der Linie liegen. Wenn beide Paare auf derselben Seite sind (dh ... alle 4 Eckpunkte erfüllen entweder y <=mx+h OR y > = mx + h), schneidet die Linie das Quadrat nicht. Dies kann rechnerisch effizienter sein als die von Ihnen beschriebenen Schritte 1 und 2. – Tryer
Vielen Dank Tryer, das ist effektiv eine viel bessere Lösung! – Wookai