如果你知道圓的中心點和圓的半徑,如果你使用向量來獲得優勢,它變得非常容易。
首先你會需要的單位向量在每個角度
- 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