나는 꼭지점과 모서리가있는 그래프를 만드는 중입니다. 그래프가 지시되므로 가장자리가 화살표로 표시됩니다. 내 문제는 화살표에 대한 올바른 좌표를 얻는 중입니다.원에 화살표 그리기
Vertex
을 갖는 Coordinate
Edge
다른 Vertex
에 Vertex
에서 이동하는 동안, (아래 클래스 참조). 도전 과제는 정점이 고정 된 반경으로 그려지는 것입니다 (아래 그림 참조). 화살표가 원주의 정확한 위치를 가리키는 데 문제가 있습니다. 그것은 내가 현재 가지고있는 코드와 같을 것입니다. 화살표는 가장 가까운 점이 아닌 왼쪽 위 모서리를 가리 킵니다.
난 화살표를 그리기 위해 다음의 방법이있다 :
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하여 응답에서 화살 부호의 요점을 얻었다.
나는
Edge
의
paintComponent
기능을 재정의 (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
분류 :
주 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에서
, 나는 원의 반지름을 복용하고 및 벡터 (방법 참조) 정규화와 함께 곱한. 이것은 내게 원주의 점을 줄 것이지만, 항상 얻지 못하는 좌상 구석에 결과가 나타나는 것 같습니다. 원본 정점에 가장 가까운 원주의 점을 계산하고 싶습니다.
어떤 제안 :과 같이
?
그게 내가하고있는 일이다. 'paintComponent' 메쏘드를 살펴보면, 원의 반경을 가져다가 정규화 된 벡터에 곱합니다. 이것은 내게 원주의 점을 줄 것이지만 항상 왼쪽 위 모서리에있는 것처럼 보입니다. 나는 그 질문을 분명히 할 것이다. – mfaerevaag
@ 7SLEVIN - 아직 모든 코드를 처리하지는 못했지만 두 가지 정점이 어디에 위치하는지에 관계없이 오프셋이 항상 대각선 (x와 y는 동일 함)을 따른다는 것이 의심 스럽습니다. 내 대답을 설명하는 화살표 끝점을 계산하는 것이 좋습니다 다음 aioobe 코드를 사용하여 원래 게시 된 (오프셋 처리하지 않기 때문에). –
@TomHopp - 완벽 해! 감사! – mfaerevaag