Итак, я программирую небольшую игру. Как игрок, вы летаете на космическом корабле в 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 этих двух линий. Полученное значение степени я должен превратить свой маркер. И это прекрасно работает
Моя проблема заключается в отображении его на краю экрана.
Моя попытка сделать так, что я создать прямоугольник, который соответствует Экран:
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