2

有人对如何计算圆线连接有任何提示/想法吗?我正在使用的设备仅支持单宽线。我正在尝试仅使用圆线连接来实现基本的抚摸。

我正在搞砸的一些事情如下。不多,但我希望根据任何回复获得一些关于如何处理两条线连接时的不同情况的想法。

提前感谢您的帮助。

我在外部连接方面取得了一些进展:

一个。获取顺时针顺序的顶点(我从扁平字形中得到这些)
b。抓取 3 个顶点
c. 计算 A 线的法线 (prevX, prevY) ​​-> (currentX, currentY)
d. 计算 B 行的法线 (currentX, currentY) -> (nextX, nextY)

我在当前顺时针顶点上左转计算法线
normal = (deltaY, -deltaX) // 感谢 Andreas

Vec2[] computeNormals(float prevX, float prevY, float x, float y, float nextX, float nextY) {
    float dx1 = x - prevX;
    float dy1 = y - prevY;

    float dx2 = x - nextX;
    float dy2 = y - nextY;

    Vec2 normal1 = new Vec2(dy1, -dx1).normalize();
    Vec2 normal2 = new Vec2(dy2, -dx2).normalize();
    if (normal1.angleDeg() > normal2.angleDeg()) {
        normal2.rot((float) Math.PI);
    }

    return (new Vec2[] { normal1, normal2 });
}

e. 从 atan2(deltaY, -deltaX) 确定外连接弧角

void computeArc(VertexBuffer dest, float x, float y, float arcRadius, Vec2 normal1, Vec2 normal2) {
    // Angle from Vecto2D is atan2(y, x)
    float angleStart = normal1.angle();
    float angleEnd = normal2.angle();

    float angleInc = (float) Math.PI / 4f; // Temporary, need to find a way to determine numVertices for a Pen of a given width
    while (angleStart > angleEnd) {
        angleStart -= (float) (2f * Math.PI);
    }
    for (float a = angleStart; a <= angleEnd; a += angleInc) {
        float vx = x + ((float) Math.cos(a) * arcRadius);
        float vy = y + ((float) Math.sin(a) * arcRadius);
        dest.addVertex(vx, vy);
    }
}
4

1 回答 1

0

如果您的设备可以绘制实心圆,您可以在 2 个端点处放置一个实心圆,并在每个线接头处放置一个。

于 2013-08-30T18:14:18.387 回答