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

FloatMath.cos(float)API 23 以来已弃用,这个对棘手等边问题的答案需要将以下代码行更新为

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