android 正五边形图表,Android 自定义View 仿蚂蚁信用分析----正多边形绘制

支付宝芝麻信用分-分析中,有个正五边形,试着做了下

效果图:

a0ecec27b0d33c40c5898b6b9bef75ca.png 

2ee3300d09471f19b2f514a34a652118.png

分析图:

b2b07b17f757fe8456680d9a1fd25b50.png

已知半径为R,圆心点O(a,b),点A(a, c=b-R), OA=OB=R,圆心角O的度数

> 求出弦AB的长度

> 利用两点间距离公式,得到两个方程AB、OB相关的,解出y的值

> 将y代入其中一个方程,解出x的值 (我这里代入的是AB的方程)

> 利用canvas旋转,循环绘制OA、AB

package com.stone.canvaspath.zhima;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

/**

* 正N边形

* author : stone

* email : aa86799@163.com

* time : 2016/11/17 14 12

*/

public class ZhimaView extends View {

private Paint mPaint;

private float mR, mCx, mCy;

private static final int mN = 9;

private static final float DEGREES_UNIT = 360 / mN; //正N边形每个角 360/mN能整除

public ZhimaView(Context context) {

this(context, null);

}

public ZhimaView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public ZhimaView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mPaint = new Paint();

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

float mW = getMeasuredWidth();

float mH = getMeasuredHeight();

mCx = mW / 2;

mCy = mH / 2;

mR = Math.min(mCx, mCy) / 4 * 3;

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

mPaint.setColor(Color.BLUE);

mPaint.setStyle(Paint.Style.STROKE);

float d = (float) (2 * mR * Math.sin(Math.toRadians(DEGREES_UNIT / 2)));

float c = mCy - mR;

float y = (d * d + mCy * mCy - c * c - mR * mR) / (2 * (mCy - c));

float x = (float) (mCx + Math.sqrt(-1 * c * c + 2 * c * y + d * d - y * y));

for (int i = 0; i < mN; i++) {

canvas.save();

canvas.rotate(DEGREES_UNIT * i, mCx, mCy);

canvas.drawLine(mCx, mCy, mCx, c, mPaint);

canvas.drawLine(mCx, c, x, y, mPaint);

canvas.restore();

}

}

}

简单的绘制正多边形,发现如上就可以了,但是想在各顶点外绘制文字、图片就还是要取到

具体的坐标值才行。所以用三角函数算出圆弧上的各顶点;在圆之外的就以增大半径值来计算

效果图:

7ffb3db050fba3d05f084200f73b9d63.png

最后还有个问题,就是这里默认是0度线起始绘制,如果想以任意度数起始绘制,

可以加个简单的旋转在最开始时,如:

canvas.rotate(30, mCx, mCy);

这时效果图:

85986b027e44442104966350ce63ab58.png

现在多边形和文本一起旋转了,这就有了新的问题:如果只旋转多边形,而不旋转对应文本呢?

可以根据公式解出旋转后的点坐标

最终效果图:

0bc8adef852b58addc3015e837f59143.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值