2013-06-05 4 views
2

나는 꼭지점과 모서리가있는 그래프를 만드는 중입니다. 그래프가 지시되므로 가장자리가 화살표로 표시됩니다. 내 문제는 화살표에 대한 올바른 좌표를 얻는 중입니다.원에 화살표 그리기

Vertex을 갖는 CoordinateEdge 다른 VertexVertex에서 이동하는 동안, (아래 클래스 참조). 도전 과제는 정점이 고정 된 반경으로 그려지는 것입니다 (아래 그림 참조). 화살표가 원주의 정확한 위치를 가리키는 데 문제가 있습니다. 그것은 내가 현재 가지고있는 코드와 같을 것입니다. 화살표는 가장 가까운 점이 아닌 왼쪽 위 모서리를 가리 킵니다.

난 화살표를 그리기 위해 다음의 방법이있다 :

public static void drawArrow(Graphics g, Color color, int size, 
     Coordinate from, Coordinate to, Coordinate offset) { 
    Graphics2D g2 = (Graphics2D) g.create(); 

    g2.setColor(color); 

    double dx = to.x - from.x, dy = to.y - from.y; 
    double angle = Math.atan2(dy, dx); 
    int len = (int) Math.sqrt(dx*dx + dy*dy); 
    AffineTransform at = AffineTransform.getTranslateInstance(from.x + offset.x, from.y + offset.y); 
    at.concatenate(AffineTransform.getRotateInstance(angle)); 
    g2.transform(at); 

    // Draw horizontal arrow starting in (0, 0) 
    g2.drawLine(0, 0, len, 0); 
    g2.fillPolygon(new int[] {len, len-size, len-size, len}, 
      new int[] {0, -size, size, 0}, 4); 
} 

내가 aioobe, here하여 응답에서 화살 부호의 요점을 얻었다.

나는 EdgepaintComponent 기능을 재정의 (override) 해,이 방법, 나는 내가 방법을 변경하려면 drawArrow 방법은 돼있 무엇을하지

@Override 
public void paintComponent(Graphics g) { 
    double radius = this.from.getRadius(); 

    Coordinate vector = this.from.getPosition().clone(); 
    vector.normalize(); 
    vector.x = vector.x * radius; vector.y = vector.y * radius; 

    Coordinate to = new Coordinate(this.to.getPosition().x - vector.x, 
      this.to.getPosition().y - vector.y); 

    GraphicsUtils.drawArrow(g, this.color, ARROW_SIZE, 
      this.from.getPosition(), to, 
      new Coordinate(radius, radius)); 
} 

으로는 A에서 B로 화살표를 그립니다 원하는 위의 메서드에서 호출합니다. 예를 들어, drawArrow 메서드 나 그와 비슷한 것에 대한 offset 매개 변수를 사용합니다.

Coordinate 분류 :

Directed graph

주 D에서 D. 후자 E 및 E에 양쪽 화살표가 표시되지된다

public class Coordinate { 

    public double x; 
    public double y; 
... 
    public void normalize() { 
     double length = Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); 
     this.x = this.x/length; 
     this.y = this.y/length; 
    } 
... 
} 

내 전류 출력의 스크린 샷 화살 머리가 D의 원에 있기 때문에.

지금 명확하게하기 위해, 문제는 다음 paintComponent -method에서

, 나는 원의 반지름을 복용하고 및 벡터 (방법 참조) 정규화와 함께 곱한. 이것은 내게 원주의 점을 줄 것이지만, 항상 얻지 못하는 좌상 구석에 결과가 나타나는 것 같습니다. 원본 정점에 가장 가까운 원주의 점을 계산하고 싶습니다.

http://www.onemotion.com/flash/sketch-paint/

어떤 제안 :과 같이

?

답변

2

꼭지점 중심 좌표와 꼭지점 이미지 반경에서 화살표 끝점을 계산할 수 있습니다. 만약 XA (나중에) 및 (XB, YB) 두 정점 (A)와 (B)의 중심은, 상기 정점은 반경 (R),

x = xa + t*(xb - xa) 
y = ya + t*(yb - ya) 

으로서 표현 될 수있을 A에서 다음의 지시 선으로 그려진 t == 1은 d = sqrt ((xb - xa) + (yb - ya) 의 거리에 해당하므로, t = r/d 및 t = (dr)/d에 대해 위의 식과 같다. (삼각대는 필요하지 않습니다.)

+0

그게 내가하고있는 일이다. 'paintComponent' 메쏘드를 살펴보면, 원의 반경을 가져다가 정규화 된 벡터에 곱합니다. 이것은 내게 원주의 점을 줄 것이지만 항상 왼쪽 위 모서리에있는 것처럼 보입니다. 나는 그 질문을 분명히 할 것이다. – mfaerevaag

+0

@ 7SLEVIN - 아직 모든 코드를 처리하지는 못했지만 두 가지 정점이 어디에 위치하는지에 관계없이 오프셋이 항상 대각선 (x와 y는 동일 함)을 따른다는 것이 의심 스럽습니다. 내 대답을 설명하는 화살표 끝점을 계산하는 것이 좋습니다 다음 aioobe 코드를 사용하여 원래 게시 된 (오프셋 처리하지 않기 때문에). –

+0

@TomHopp - 완벽 해! 감사! – mfaerevaag