ラウンドラインの結合を計算する方法に関するヒント/アイデアはありますか? 私が取り組んでいるデバイスは、単一幅の線のみをサポートしています。丸い線の結合のみで基本的なストロークを実装しようとしています。
私がいじっているいくつかのことは以下のとおりです。大したことではありませんが、返信に基づいて、2 つの回線が結合するさまざまなケースを処理する方法についていくつかのアイデアを得たいと考えています。
助けてくれてありがとう。
私は外部結合でいくつかの進歩を遂げました:
a. a.時計回りの頂点を取得します (平坦化されたグリフからこれらを取得します)
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);
}
}