将等边三角形刻在圆圈中,知道顶点或侧面

时间:2012-10-05 18:45:30

标签: android canvas geometry

我正在学习Android,现在我正在尝试使用Canvas类。

我想绘制一个刻在已知圆圈上的规则(等边)三角形。

我认为必须有一种比进入三角形,毕达哥拉斯,更容易的方法......

3 个答案:

答案 0 :(得分:2)

执行trig是我发现的最简单的方法。下面是在正常的“向上指向”方向上绘制等边三角形的函数。我发布了一个更复杂的实现here,它也可以处理旋转三角形。

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

答案 1 :(得分: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

答案 2 :(得分:0)

由于API {23}已弃用FloatMath.cos(float),因此对棘手的等边问题的回答需要将以下代码行更新为

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