2009-04-29 6 views
4

ich diese MatrixPoint-in-Rechteck Test

/// as if the create a rectangle 
int [][] loc = { 
    {5, 15},//(x1, y1) 
    {5, 30}, // (x1, y2) 
    {20, 15},// (x2, y1) 
    {20, 30}, // (x2, y2) 
} 

// this are the point that i want to check if they are in the rectangular range or not 
int [] [] point = { 
    {6, 16}, //(x, y) 
    {3, 17}, //(x, y) 
} 

Ich mag i Methode, die den Punkt nehmen und suchen, wenn es in dem loc Bereich oder nicht von x1<x<x2 und y1<y<y2

+0

Um ein Rechteck zu definieren, benötigen Sie nur 2 Punkte (wählen Sie 2 diagonal gegenüberliegende Punkte) oder 2 x Werte und 2 y Werte. –

+0

Nun, ein Achse ausgerichtetes Rechteck sowieso ... – Skilldrick

+0

Ist das Code Javascript? –

Antwort

14

A mit Punkt (x, y) innerhalb eines Rechtecks ​​(x1, y1) - (x2, y2), wenn

(x1 < = x < = x2) und (y1 = y < < = y2)

Ihr Code sollte wie folgt aussehen (dies ist eigentlich C-Code, aber JavaScript sollte nicht viel anders sein):

x1 = loc[0][0]; 
x2 = loc[2][0]; 
y1 = loc[0][1]; 
y2 = loc[2][1]; 
for (int i = 0; i < num_points; i++) { 
    if ((x1 <= point[i][0]) && (point[i][0] <= x2) && 
     (y1 <= point[i][1]) && (point[i][1] <= y2)) { 
    // This point is inside the rectangle - insert code here 
    } else { 
    // This point is not inside the rectangle - insert code here 
    } 
} 

Beachten Sie, dass dies nur, wenn (x1 < = x2 arbeiten) und (y1 < = y2), so dass Sie vielleicht sicher durch die Verwendung dieses machen könnte, anstatt die ersten vier Zeilen weiter oben:

x1 = Math.Min(loc[0][0], loc[2][0]); 
x2 = Math.Max(loc[0][0], loc[2][0]); 
y1 = Math.Min(loc[0][1], loc[2][1]); 
y2 = Math.Max(loc[0][1], loc[2][1]); 
+0

schnaader; Können Sie mir mehr erklären, was Sie meinen? –

+0

ok auf diese weise muss ich eine min-methode richtig haben? –

+0

JavaScript sollte dies für Sie tun können, wenn Sie Math.Min und Math.Max ​​verwenden, ich werde meine Antwort aktualisieren. – schnaader

6

Obwohl die Frage ausführlich beantwortet wurde, würde Ich mag mein Stück Code teilen weil es intuitiver aussieht und mo sieht Wie die Mathematik, die ich in der Highschool hatte. Nur für den Fall Menschen sehen diese Frage, weil von zu Hause aus arbeiten :)

function between(min, p, max){ 
    result = false; 

    if (min < max){ 
    if (p > min && p < max){ 
     result = true; 
    } 
    } 

    if (min > max){ 
    if (p > max && p < min){ 
     result = true 
    } 
    } 

    if (p == min || p == max){ 
    result = true; 
    } 

    return result; 
} 

function point_in_rectagnle(x, y, left, top, right, bottom){ 
    result = false; 

    if (between(left,x,right) && between(top,y,bottom)){ 
    result = true; 
    } 
    return result; 
} 
+0

Das ist eine sehr schöne elegante Lösung – jolyonruss

4

Der Code in der Frage ist, Java oder C oder eine andere Sprache, die Array-Literale mit {} definiert, aber da der Tag ist Javascript und diese zeigt auf Google für Javascript, hier ist eine sinnvolle Möglichkeit, Punkt-Rechteck-Kreuzung in JS zu tun.

function pointRectangleIntersection(p, r) { 
    return p.x > r.x1 && p.x < r.x2 && p.y > r.y1 && p.y < r.y2; 
} 

var point = {x: 1, y: 2}; 
var rectangle = {x1: 0, x2: 10, y1: 1, y2: 7}; 
pointRectangleIntersection(point, rectangle); 
+0

Sollte wirklich in 'p.x> = r.x1' sein (gleich für y). Und abhängig davon, ob Ihre Rechtecke inklusive oder exklusiv sind, muss y2_may_ '<=' sein – Anonymouse

Verwandte Themen