gpt4 book ai didi

java - 将箭头绘制到圆圈

转载 作者:行者123 更新时间:2023-11-30 09:21:32 24 4
gpt4 key购买 nike

我正在致力于创建具有顶点和边的图形。该图是有向的,所以边用箭头表示。我的问题是获取箭头的正确坐标。

一个 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);
}

我从aioobehere的回答中得到了箭头代码的要点.

我通过覆盖 EdgepaintComponent 函数来实现此方法:

@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));
}

因为 drawArrow 方法做了它应该做的事情,它绘制了一个从 a 到 b 的箭头,我想改变我在上面的方法中调用它的方式。例如,通过为 drawArrow 方法或类似方法使用偏移参数。

坐标类:

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;
}
...
}

我当前输出的屏幕截图:

Directed graph

请注意,从 D 到 E 和从 E 到 D 都有箭头。后者没有显示,因为箭头在 D 的圆圈后面。

现在要清楚,问题是:

paintComponent 方法中,我取圆的半径并将其与标准化(参见方法) vector 相乘。这会给我一个圆周的点,但似乎总是在左上角,我没有得到。我想计算最接近源顶点的圆周上的点。

像这样:

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

有什么建议吗?

最佳答案

您可以根据顶点中心坐标和顶点图像半径计算箭头端点。设(xa,ya)和(xb,yb)为两个顶点a和b的圆心,顶点的半径为r,则a到be的有向线可表示为

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

对于从 0 到 1 变化的参数 t。由于 t == 1 对应于距离 d = sqrt((xb - xa)2 + (yb - ya) 2),你只需要计算上面的 t = r/d 和 t = (d-r)/d。 (无需触发。)

关于java - 将箭头绘制到圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16950009/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com