Android – 计算弧角

前端之家收集整理的这篇文章主要介绍了Android – 计算弧角前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个圆弧,我希望在0度,45度,90度,135度,180度绘制刻度标记,是否有人可以帮助我获得在此草图上获得点5和点30的x,y所需的数学?

这是我绘制1刻度标记代码.

private void drawScale(Canvas canvas) {
        //canvas.drawOval(scaleRect,scalePaint);

        canvas.save();

        Paint p = new Paint();
        p.setColor(Color.WHITE);
        p.setStrokeWidth(10f);
        canvas.drawLine(rectF.left-getWidth()/20,rectF.height()/2,rectF.left,p);


    canvas.restore();
}

解决方法

您可以使用sin和cos计算其旋转.让我们假设您有零点A,并希望将其旋转到旋转30°的B点.
像这样的东西:

基本上新点是(cx x,cy y).在这个特殊情况下,sin和cos的定义将是下一个:

sin = x/R
cos = y/R

获得精确的x和y并不难.因此,要在已知半径的圆圈中旋转特定角度的点,我们需要以下一个方式计算坐标:

x = cx + sin(angle) * R; 
y = cy + cos(angle) * R;

现在让我们回到Android和Canvas!

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.save();
    float cx = getWidth() / 2f;
    float cy = getHeight() / 2f;

    float scaleMarkSize = getResources().getDisplayMetrics().density * 16; // 16dp
    float radius = Math.min(getWidth(),getHeight()) / 2;

    for (int i = 0; i < 360; i += 45) {
        float angle = (float) Math.toRadians(i); // Need to convert to radians first

        float startX = (float) (cx + radius * Math.sin(angle));
        float startY = (float) (cy - radius * Math.cos(angle));

        float stopX = (float) (cx + (radius - scaleMarkSize) * Math.sin(angle));
        float stopY = (float) (cy - (radius - scaleMarkSize) * Math.cos(angle));

        canvas.drawLine(startX,startY,stopX,stopY,scalePaint);
    }

    canvas.restore();
}

代码将以45°的步长绘制标记.请注意,您需要将角度转换为弧度,对于Y轴,我在画布上使用减去原因将其翻转.这是我得到的:

猜你在找的Android相关文章