2017-02-23 4 views
-5

ich die Frage oben erwähnt wurde die Lösung bekam aber zu verwirrt mit der Mathematik Gleichungen und Variablen. Ich versuchte zunächst, Koordinaten von zwei anderen Punkten zu finden, aber die Gleichungen konnten von mir nicht gelöst werden, da waren viele Variablen und ich war verwirrt. Wenn das abgeschlossen wäre, hätte ich versucht, die Position des Punktes in Bezug auf die Seiten zu überprüfen, aber das würde auch viele Variablen und Verwirrung beinhalten. Ein guter Algorithmus könnte nur hilfreich sein. Danke!Wie schreibe ich ein C-Programm zu überprüfen, ob ein Punkt innerhalb eines Quadrats gegeben Endpunkte einer seiner Diagonalen liegt

+1

Bitte einige Zeit [die Hilfeseiten] lesen nehmen (http://stackoverflow.com/help), insbesondere die Abschnitte genannt [ "Welche Themen kann ich hier fragen?"] (Http://stackoverflow.com/help/on-topic) und ["Welche Arten von Fragen sollte ich vermeiden zu fragen?"] (Http://stackoverflow.com/help/nicht fragen). Auch bitte [nehmen Sie die Tour] (http://stackoverflow.com/tour) und [lesen Sie, wie man gute Fragen stellt] (http://stackoverflow.com/help/how-to-ask). Zuletzt erfahren Sie, wie Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) erstellen können. –

+2

Sie brauchen hier nicht wirklich viel Mathematik. Zeichnen Sie das Quadrat und beobachten Sie, was mit den X- und Y-Koordinaten des Punktes geschieht, wenn Sie ihn in das Quadrat hinein und aus ihm heraus bewegen. Vergleichen Sie die X- und Y-Koordinaten des Punktes mit den X- und Y-Koordinaten der beiden Punkte auf der Diagonale. –

+0

Sie sollten die Beispieldaten mindestens anzeigen. Wenn die Punkte (0,0) und (3,3) zum Beispiel oder (2,5) und (4,7) sind, ist alles sehr geradlinig, weil die Seiten des Quadrats parallel zu den Achsen sind. Wenn die Punkte (0,0) und (3,6) sind, brauchen Sie viel mehr Mathematik, um die Antwort zu berechnen, weil das Quadrat schräg ist. Sie sollten auch zeigen, dass Sie genug Mathematik studiert haben, um zu wissen, wie Sie die Berechnungen durchführen. Wenn nicht, dann müssen Sie diesen Teil Ihres Problems beheben, bevor Sie Hilfe mit Code erhalten. Wenn Sie die betreffende Mathematik kennen, können Sie mit dem Codieren einer Lösung beginnen. –

Antwort

3

Sie können zwei weitere Punkte von Platz finden:

x1 = ? ; y1 = ? ; // First diagonal point 
x2 = ? ; y2 = ? ; // Second diagonal point 

xc = (x1 + x2)/2 ; yc = (y1 + y2)/2 ; // Center point 
xd = (x1 - x2)/2 ; yd = (y1 - y2)/2 ; // Half-diagonal 

x3 = xc - yd ; y3 = yc + xd; // Third corner 
x4 = xc + yd ; y4 = yc - xd; // Fourth corner 

Nach vier Punkte von Platz haben, können Sie überprüfen, ob der angegebene Punkt innerhalb des Quadrats liegt dann die Fläche der vier Dreiecke, wie unten Bild gleich wird der Bereich des Quadrats. enter image description here

Lesen Sie mehr:

https://math.stackexchange.com/questions/506785/given-two-diagonally-opposite-points-on-a-square-how-to-calculate-the-other-two

https://martin-thoma.com/how-to-check-if-a-point-is-inside-a-rectangle/

+0

Interessant - der Code "andere zwei Punkte" ist einfacher als ich erwartet hatte. Es ist eine Weile her, seit ich zuletzt die Fläche eines Dreiecks mit den Koordinaten der drei Ecken berechnen musste. Klar ist das aber berechenbar (und dafür gibt es wahrscheinlich auch eine überraschend einfache Formel). –

4

Lassen Sie uns Eckpunkte A und B und der Punkt P (zufällig dem Namen C auf dem Bild). Finden Vektoren AB, AP, BP

enter image description here

AB.X = B.X - A.X 
AB.Y = B.Y - A.Y 
and so on 

P innerhalb des Quadrats liegt, wenn Skalarprodukte nicht negative

cA = AP x AB //(AP.X * AB.Y - AP.Y * AB.X) 
dA = AP dot AB //(AP.X * AB.X + AP.Y * AB.Y) 
cB = -(AB x BP) 
dB = -(AB dot BP) 

und absolute Wert der Quer Produkte sind weniger als Skalarprodukte

dA >= Abs(cA) 
dB >= Abs(cB) 

(dies entspricht der Überprüfung, ob die Winkel liegen Bereich -Pi/4..Pi/4)

2

Lassen Sie Ihr Problem annehmen, ist 2D (wie in 3D oder N-D Sie weitere Informationen benötigen).Ich würde es so lösen:

  1. finden 2 fehlt Scheiteln

    wir A,B und wollen also wissen die C,D:

    diagonal

    M = (A+B)/2 
    v1 = B-M 
    

    v2 erhalten wir Ausnutzen Tatsache, dass in 2D Vektoren (x,y) und (y,-x) senkrecht sind und die gleiche Größe so:

    v2 = (v1y,-v2x) 
    

    Der Rest ist einfach:

    C = M - v2 
    D = M + v2 
    
  2. compute 2 Kante Basisvektoren

    basis vectors

    U = C-A 
    V = D-A 
    
  3. Verwendung Skalarprodukt innerhalb Bereich überprüfen

    dot

    dot(I,J) = (I.J) = (Ix*Jx) + (Iy*Jy) 
    

    Bietet die senkrechte Projektion von I in J (wenn beide Vektoren sind Einheit) oder umgekehrt, so dass wir es ausnutzen um festzustellen, ob der Punkt P im Quadrat ist:

    W = P-A 
    tu = (U.W)/(|U|*|W|) 
    tv = (V.W)/(|V|*|W|) 
    if ((tu>=0.0)&&(tu<=1.0)&&(tv>=0.0)&&(tv<=1.0)) return inside; 
    else return outside; 
    

Nur vollständige abs Wert des Vektors werden wird wie folgt berechnet:

abs(I) = |I| = sqrt (Ix*Ix + Iy*Iy) 
Verwandte Themen