2016-10-28 11 views
-2

그래서, 나는 작은 게임을 프로그래밍하고있다. 플레이어는 2 차원 공간에서 우주선을 조종합니다. 스캐너에서 선택한 경우 태양이나 행성과 같이 선택한 객체를 가리키는 마커가 필요합니다. 화면 경계에서 마커를 그리는 것 외에는 그 모든 것이 잘 작동합니다. 여기 java 찾기 선과 사각형의 교차점

지금까지 내 programm에 있습니다 : 내가 먼저가 화면 벗어 물체의 방향을 가리킬 수 있도록, 마커를 회전하기 위해 마커 Marker

그린

전 이 Algorythm을 사용하십시오.

double Marker_vec = Math.toDegrees(Vector2F.getAngle(SolarSystem.object_vectors[marker],center,player.pos)); 

public static double getAngle(Vector2F v1, Vector2F v2, Vector2F fixed) 
{ 

    double angle1 = Math.atan2(v1.ypos - fixed.ypos, v1.xpos - fixed.xpos); 
    double angle2 = Math.atan2(v2.ypos - fixed.ypos, v2.xpos - fixed.xpos); 
    return angle1 - angle2; 
} 

기본적으로 내가하는 일이, 화면의 선수 선박의 고정 점과 개체의 왼쪽에 고정 점을 그 두 줄 inbetween 각도를 얻을 수있다. 결과 값은 내가. 내 마커를 설정해야 할 정도입니다 그리고 그

Get angle

내 문제는 화면 가장자리에 표시하는 것입니다 잘 작동합니다. 나 X, Y의 직사각형 값들을 사용 잘라

이어서
screen_rec = new Rectangle(0,0,Main.width-1,Main.height-1); 

, 폭과 높이가 서로를 형성하는 4 개 라인을 만들 :

이렇게 내 시도 나 화면에 맞는 사각형을 만들 수 있다는 것이다 화면 주위의 직사각형. 이제 플레이어와 선택한 객체 사이에 그려진 선이 사각형의 선들과 교차하여 그 점을 얻고 싶습니다. 마지막으로 회전 된 마커 이미지를 좌표에 표시합니다.

다음은 그

marker_vec = Vector2F.getIntersectionPoint(line, Player.screen_rec); 

public static Point intersection(Line2D lineA, Line2D lineB) 
{ 
    double x1 = lineA.getX1(); 
    double y1 = lineA.getY1(); 

    double x2 = lineA.getX2(); 
    double y2 = lineA.getY2(); 

    double x3 = lineB.getX1(); 
    double y3 = lineB.getY1(); 

    double x4 = lineB.getX2(); 
    double y4 = lineB.getY2(); 

    double d = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4); 
    if (d == 0) return null; 

    double xi = ((x3-x4)*(x1*y2-y1*x2)-(x1-x2)*(x3*y4-y3*x4))/d; 
    double yi = ((y3-y4)*(x1*y2-y1*x2)-(y1-y2)*(x3*y4-y3*x4))/d; 
    return new Point((int)xi,(int)yi); 
} 

public static Point[] getIntersectionPoint(Line2D line, Rectangle2D rectangle) { 

    Point[] p1 = new Point[4]; 



    // Top line 
    p1[0] = intersection(line, 
        new Line2D.Double(
        rectangle.getX(), 
        rectangle.getY(), 
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY())); 
    // Bottom line 
    p1[1] = intersection(line, 
        new Line2D.Double(
        rectangle.getX(), 
        rectangle.getY() + rectangle.getHeight(), 
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY() + rectangle.getHeight())); 
    // Left side... 
    p1[2] = intersection(line, 
        new Line2D.Double(
        rectangle.getX(), 
        rectangle.getY(), 
        rectangle.getX(), 
        rectangle.getY() + rectangle.getHeight())); 
    // Right side 
    p1[3] = intersection(line, 
        new Line2D.Double(
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY(), 
        rectangle.getX() + rectangle.getWidth(), 
        rectangle.getY() + rectangle.getHeight())); 




    return p1; 

} 

내 코드입니다 어쨌든 마커은 상단과 왼쪽 sceenside에 표시됩니다. 나는 드로잉 함수에서 xaxis의 너비를 뺀 값으로 풀려고했지만 그게 효과가 없었습니다. 그리고 선수와 객체 사이의 선이 그 직사각형과 교차하지 않기 때문에 그 선은 어쨌든 교차점을 가질 수 없습니다. 나는 코멘트에서 보이는 방법의 심상을 게시 할 것이다 나는 방금 serveral 일 동안 시도하고 어떤 해결책든지 찾아 낼 수 없다. 사전에 덕분에

Spytrycer

답변

0

나는 그것을 해결했다. 나는 라인을 제거있어 :

if (d == 0) return null; 

그리고 내가 마커를 그린 동안은 충분히 진행되지 않았다.

더하기, 나는 draw 함수를 if로 둘러 쌌고 각도가 특정 값일 때 마커 만 표시되도록했습니다.