3

私はAndroidを学んでいて、今はCanvasクラスを試しています。

既知の円に内接する正三角形(正三角形)を描きたいと思います。

三角測量、ピタゴラス、...に入るよりも簡単な方法があるに違いないと思います。

4

3 に答える 3

2

三角法を実行することは、私が見つけた最も簡単な方法です。以下は、通常の「上向き」の向きで正三角形を描くための関数です。三角形の回転も処理する、より洗練された実装をここに投稿しました。

private void drawCircumscribedTriangle(Canvas canvas, float circleCenterX, float circleCenterY, float radius, Paint paint) {
    float xOffsetFromCenter = FloatMath.cos((float)Math.PI/6) * radius;
    float yOffsetFromCenter = FloatMath.sin((float)Math.PI/6) * radius;

    canvas.drawLine(circleCenterX, circleCenterY - radius, circleCenterX + xOffsetFromCenter, circleCenterY + yOffsetFromCenter, paint);
    canvas.drawLine(circleCenterX + xOffsetFromCenter, circleCenterY + yOffsetFromCenter, circleCenterX - xOffsetFromCenter, circleCenterY + yOffsetFromCenter, paint);
    canvas.drawLine(circleCenterX - xOffsetFromCenter, circleCenterY + yOffsetFromCenter, circleCenterX, circleCenterY - radius, paint);
}
于 2012-10-06T04:35:30.893 に答える
1

Acjのおかげで、私はそれを手に入れました、しかし、私がそれを埋めたかったので、それは私が望んでいたものではありませんでした(私がそれを指定しなかったのでそれは私のせいです)。

とにかく、私はAcjのコードを自分のニーズに適合させました、そしてここにそれがあります:

private void drawCircumscribedTriangle(Canvas canvas, float circleCenterX, float circleCenterY, float radius, Paint paint) {

        float xOffsetFromCenter = FloatMath.cos((float)Math.PI/6) * radius;
        float yOffsetFromCenter = FloatMath.sin((float)Math.PI/6) * radius;

        Path path = new Path();
        path.setFillType(Path.FillType.EVEN_ODD);

        path.moveTo(circleCenterX, circleCenterY - radius);
        path.lineTo(circleCenterX + xOffsetFromCenter, circleCenterY + yOffsetFromCenter);
        path.lineTo(circleCenterX - xOffsetFromCenter, circleCenterY + yOffsetFromCenter);
        path.lineTo(circleCenterX, circleCenterY - radius);
        path.lineTo(circleCenterX, circleCenterY - radius);
        canvas.drawPath(path, paint);
}

もう一度、すべてのメリットはAcjにあります

于 2012-10-06T13:26:16.660 に答える
0

API 23以降廃止されたようFloatMath.cos(float)に、トリッキーな正三角形の質問に対するこの回答には、次のコード行を更新する必要があります。

float xOffsetFromCenter =  ((float)Math.PI/6) * radius;
float yOffsetFromCenter =  ((float)Math.PI/6) * radius;
于 2016-02-27T14:34:48.993 に答える