如果您知道圆的中心点和半径,并且使用向量来帮助您,那么这将变得相当容易。
首先,您需要在每个角度上使用单位向量:
- 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),
new UnitVector((float) (-1/Math.sqrt(2)), (float) (1/Math.sqrt(2))),
new UnitVector(0, 1),
new UnitVector((float) (1/Math.sqrt(2)), (float) (1/Math.sqrt(2))),
new UnitVector(1, 0),
new UnitVector((float) (1/Math.sqrt(2)), (float) (-1/Math.sqrt(2))),
new UnitVector(0, -1),
new UnitVector((float) (-1/Math.sqrt(2)), (float) (-1/Math.sqrt(2))),
};
static class UnitVector {
final float x;
final float y;
UnitVector(final float x, final float y) {
this.x = x;
this.y = y;
}
}
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
来设置中心点,这样代码会更加整洁。看起来你已经考虑到了这一点,因为你使用了save
和restore
来保存画布矩阵。 - westoncanvas.translate(-cx,-cy)
的翻译是:canvas.translate(-cx,-cy)
。 - westonstartX,startY,stopX,stopY
。 - andrew