2016-10-28 3 views
-2

Итак, я программирую небольшую игру. Как игрок, вы летаете на космическом корабле в 2-м месте. Я хочу иметь маркер, который указывает на выбранный объект, как солнце или планету, если он выбран в сканере. Все это прекрасно работает, за исключением чертежа маркера на границе экрана.java найти пересечение Line и Rectangle

Вот моя программа до сих пор:

я первый написал маркер Marker

Для того, чтобы повернуть маркер, чтобы она указывала в направлении объекта, который находится вне экрана, я используйте этот Алгоритм.

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

Моя проблема заключается в отображении его на краю экрана.

Моя попытка сделать так, что я создать прямоугольник, который соответствует Экран:

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

Тогда я срезанные использовал прямоугольники значения X, Y, ширина и высота для создания 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 в функции рисования, но это не сработало. И эти строки не должны иметь никаких точек пересечения в любом случае, потому что линия между игроком и объектом не пересекается с этой прямоугольной линией. Я буду размещать изображения того, как он выглядит в комментариях Я только что пробовал в течение серверных дней и не мог найти какое-либо решение. Заранее спасибо

Spytrycer

ответ

0

я решил. Я избавился от линии:

if (d == 0) return null; 

И пока, где я нарисовал маркеры, не было достаточно долго.

Плюс, я окружил функции рисования с помощью if и удостоверился, что маркеры отображаются только в том случае, когда угол является конкретным значением.