2014-03-04 3 views
0

Я хочу создать стрелку (---->) на моей карте, соединяя 2 заданные координаты.JMapViewer нарисуйте многоугольник, который будет выглядеть стрелкой

К настоящему времени я использовал нарисовать линию с помощью реализации полигона предложил here и here

Есть ли способ acheieve это?

Спасибо, Ozrad

+1

Как правило, да, вы могли бы использовать концепцию ts продемонстрировал [здесь] (http://stackoverflow.com/questions/15607427/java-make-a-directed-line-and-make-it-move/15607737#15607737) и [здесь] (http: // stackoverflow .com/questions/20129281/mouse-motion-listener-only-in-one-direction/20131064 # 20131064) для некоторых идей. Они оба используют «Path2D» для генерации формы и вычисления угла между точками для ориентации фигуры. Ваше требование на самом деле немного проще, так как у вас уже есть начальная и конечная точки, поэтому должно быть возможно рассчитать длину линии или угла стрелки – MadProgrammer

+0

Спасибо за ваш ответ. Мне нужна стрелка, чтобы быть в JMapViewer, и ваши ссылки показывают это в Graphics2D, я думаю? –

+1

Так и твой. Ваша первая ссылка создает «Path2D» и рисует ее в контексте Graphics2D ... – MadProgrammer

ответ

1

Вообще-то да, вы могли бы использовать понятия продемонстрированные в Java make a directed line and make it move и mouse motion listener only in one direction для некоторых идей.

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

Ваше требование на самом деле немного проще, поскольку у вас уже есть начальная и конечная точки, поэтому должно быть возможно рассчитать длину линии или угла стрелки, в зависимости от того, что для вас проще (я бы расчета длины линии между точками и вращая его, но это только мне)

+0

Спасибо человеку! Действительно полезно –

+1

Я завидую вам возможностью поиграть с 'JMapViewer';) – MadProgrammer

0

Комплексное решение, основанное на @MadProgrammer помощи, заключается в следующем:

import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.geom.Path2D; 
import java.util.List; 
import java.awt.Graphics; 

import org.openstreetmap.gui.jmapviewer.MapPolygonImpl; 
import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate; 

public class MyMapMarkerArrow extends MapPolygonImpl { 

    public MyMapMarkerArrow(List<? extends ICoordinate> points) { 
     super(null, null, points); 
    } 

    @Override 
    public void paint(Graphics g, List<Point> points) { 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setColor(getColor()); 
     g2d.setStroke(getStroke()); 
     Path2D path = buildPath(points); 
     g2d.draw(path); 
     g2d.dispose(); 
    } 

    private Path2D buildPath(List<Point> points) { 
     Path2D path = new Path2D.Double(); 
     if (points != null && points.size() > 0) { 
      Point firstPoint = points.get(0); 
      path.moveTo(firstPoint.getX(), firstPoint.getY()); 
      for (Point p : points) { 
       path.lineTo(p.getX(), p.getY()); 
      } 

      int pointsSize = points.size() - 1; 

      if (points.get(0).getY() > points.get(1).getY()) { 
       path.lineTo(points.get(pointsSize).getX(), 
         points.get(pointsSize).getY() + 20); 

       path.moveTo(points.get(pointsSize).getX(), 
         points.get(pointsSize).getY()); 

       path.lineTo(points.get(pointsSize).getX() - 20, 
         points.get(pointsSize).getY()); 
      } else { 
       path.lineTo(points.get(pointsSize).getX(), 
         points.get(pointsSize).getY() - 20); 

       path.moveTo(points.get(pointsSize).getX(), 
         points.get(pointsSize).getY()); 

       path.lineTo(points.get(pointsSize).getX() + 20, 
         points.get(pointsSize).getY()); 
      } 
     } 
     return path; 
    } 
} 

Еще раз спасибо за помощь

Смежные вопросы