我正在学习Android,现在我正在尝试使用Canvas类。
我想绘制一个刻在已知圆圈上的规则(等边)三角形。
我认为必须有一种比进入三角形,毕达哥拉斯,更容易的方法......
答案 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;