如果你知道圆的中心点和圆的半径,如果你使用向量来获得优势,它变得非常容易。
首先你会需要的单位向量在每个角度
- 0度 - >(-1,0)
- 45度 - >( - 1/SQRT(2),(1/SQRT(2))
- 90度 - >(0,1)
- 135度 - >(1/SQRT(2),(1/SQRT(2))
- 180度 - >(1 ,0)
您可以然后使用下面的公式计算必要点数
point = center + (unit vector * distance from center)
这是一个更具体的例子,因为安德鲁增加了一个。
private static final float RADIUS = 400.0f;
private static final float MARK_LENGTH = 30.0f;
private static final UnitVector[] UNIT_VECTORS = new UnitVector[] {
new UnitVector(-1,0), // 0 deg
new UnitVector((float) (-1/Math.sqrt(2)), (float) (1/Math.sqrt(2))), // 45 deg
new UnitVector(0, 1), // 90 deg
new UnitVector((float) (1/Math.sqrt(2)), (float) (1/Math.sqrt(2))), // 135 deg
new UnitVector(1, 0), // 180 deg
new UnitVector((float) (1/Math.sqrt(2)), (float) (-1/Math.sqrt(2))), // 225 deg
new UnitVector(0, -1), // 270 deg
new UnitVector((float) (-1/Math.sqrt(2)), (float) (-1/Math.sqrt(2))), // 315 deg
};
static class UnitVector {
final float x;
final float y;
UnitVector(final float x, final float y) {
this.x = x;
this.y = y;
}
}
// Call this from onDraw
public void drawMarks(final Canvas canvas) {
for (final UnitVector unitVector : UNIT_VECTORS) {
this.drawMarkWithVector(unitVector, canvas);
}
}
private void drawMarkWithVector(final UnitVector unitVector, final Canvas canvas) {
final float centerPointX = this.getWidth()/2;
final float centerPointY = this.getHeight()/2;
final float startX = centerPointX + (unitVector.x * RADIUS);
final float startY = centerPointY + (unitVector.y * RADIUS);
final float endX = centerPointX + (unitVector.x * (RADIUS + MARK_LENGTH));
final float endY = centerPointY + (unitVector.y * (RADIUS + MARK_LENGTH));
canvas.drawLine(startX, startY, endX, endY, this.paint);
}
下面是代码的上述
不错,你可以使用['Canvas.translate '](http://developer.android.com/reference/android/graphics/Canvas.html#translate(float,%20float))来设置中心,那么你可以忘掉它。它看起来像你想过的,因为你保存和恢复画布矩阵。 – weston
'canvas.translate(-cx,-cy)';然后删除所有其他对'cx','cy'的引用 – weston