2013-02-03 3 views
5

Byłem na tym od wielu godzin, próbując różnych metod patrząc na prawie każde pytanie. Być może mam to całkowicie błędne, ale czuję, że mam jego matematyki poprawne, ale bez względu na to, jakie dane wprowadzam, otrzymuję taki sam wynik. Mój kod jest gdzieś wyłączony i muszę go włączyć do północy.Ustalanie, czy punkt znajduje się w obrębie trójkąta

Wszystko to sprawia przyjemność: Znajdź, czy punkt znajduje się w obrębie kodu trójkąta. (Dla początkujących)

import java.util.Scanner; 

public class PointsTriangle { 

    // checks if point entered is within the triangle 
    //given points of triangle are (0,0) (0,100) (200,0) 
    public static void main (String [] args) { 
     //obtain point (x,y) from user 
     System.out.print("Enter a point's x- and y-coordinates: "); 
     Scanner input = new Scanner(System.in); 
     double x = input.nextDouble(); 
     double y = input.nextDouble(); 

     //find area of triangle with given points 
     double ABC = ((0*(100-0 )+0*(0 -0)+200*(0-100))/2.0); 
     double PAB = ((x*(0 -100)+0*(100-y)+0 *(y- 0))/2.0); 
     double PBC = ((x*(100-0 )+0*(0 -y)+200*(y-100))/2.0); 
     double PAC = ((x*(0 -100)+0*(100-y)+200*(y- 0))/2.0); 

     boolean isInTriangle = PAB + PBC + PAC == ABC; 

     if (isInTriangle) 
      System.out.println("The point is in the triangle"); 
     else 
      System.out.println("The point is not in the triangle"); 
    }//end main 
}//end PointsTriangle 
+0

To chyba warto wyprowadzania wartości uważasz odczytywane jako część debugowania ... – Floris

Odpowiedz

5

Jeśli narysować obrazek, można zobaczyć punkt musi spełniać prostych nierówności (poniżej/powyżej/w prawo niektórych liniach). Czy „na krawędzi” jest w lub na zewnątrz odejdę do ciebie:

Y > 0 (above the X axis) 
X > 0 (to the right of the Y axis) 
X + 2* Y < 200 (below the hypotenuse) 

zapis if wokół tych trzech i gotowe:

if((y > 0) && (x > 0) && (x + 2*y < 200)) 
    System.out.println("The point is in the triangle"); 
else 
    System.out.println("The point is not in the triangle"); 
+0

Nie mogę ci dziękować. Zawsze wszystko przemyślałem. Zrobiłeś mój weekend! – Lish

+0

@Lish - nie ma za co. Późne wieczory robią to dla twojego mózgu ... – Floris

5

umieściłeś wartość zamówienia złego do twojej formuły; dlatego wynik jest błędny. Jeśli 3 wierzchołki są następującym

A(x1, y1) B(x2, y2), C(x3, y3) 

wówczas obszar ten jest obliczany jako

double ABC = Math.abs (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2))/2; 

potem, po prostu zastąpić każdy wierzchołek z punktem wejściowym, będziemy mieli następujące trójkąty: PBC, APC, ABP.

umieścić wszystko razem, będziemy mieli prawidłowa

int x1 = 0, y1 = 0; 
int x2 = 0, y2 = 100; 
int x3 = 200, y3 = 0; 

// no need to divide by 2.0 here, since it is not necessary in the equation 
double ABC = Math.abs (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)); 
double ABP = Math.abs (x1 * (y2 - y) + x2 * (y - y1) + x * (y1 - y2)); 
double APC = Math.abs (x1 * (y - y3) + x * (y3 - y1) + x3 * (y1 - y)); 
double PBC = Math.abs (x * (y2 - y3) + x2 * (y3 - y) + x3 * (y - y2)); 

boolean isInTriangle = ABP + APC + PBC == ABC;