Canvas利用圆绘制正余弦叠加图像

占坑--持续完善中....

前言


昨天看傅里叶变换的资料,看到这篇文章:如果看了此文你还不懂傅里叶变换,就过来掐死我吧
讲得很清晰,中间一幅图的美丽深深吸引了我。。。

正弦函数叠加图像

于是萌生了利用Canvas把它画下来的想法。可是正余弦函数的基础早已经忘得差不多了,
所以先画个大概,慢慢更新当作毕设前练手吧。现在的样子:
现在的粗糙样子

博客新手。。如果各位看官觉得条理比较乱请指教一下


准备工作


画圆相关

先自定义了一个Circle类,方便添加任意多个圆

public class Circle {
    //主颜色
    private int color;
    //半径
    private int radius;
    //圆心
    private Point mCenterPoint;
    //圆上动点当前位置
    private Point mMovePoint;
    //当前动点移动角度
    private int mCurrentDegree;
    //动点角度增量
    private int mIncreaseDegree;
    //getter和setter省略
}

画圆之前要先弄清楚一个概念,弧度和角度,引用维基定义:

弧度:单位弧度定义为圆弧长度等于半径时的圆心角。
角度:一周角分为360等份,每份定义为1度(1°)

图片均引自:这篇博客

弧度示意图
弧度示意图

弧度示意图
弧度示意图

大圆的相关参数

    private List<Circle> circles = new ArrayList<>();
    
    //第一个大圆的相关参数
    private int mMainColor = 0xFF009688;
    private int mCircleStartDegree = 0;
    private int mCircleIncreaseDegree = 4;
    private Point mCircleCenter = new Point(dp2px(50),dp2px(20));
    private int mLargeRadius = dp2px(30);

画图像相关

    //圆当前指向图像的点
    private Point mOriginWavePoint = new Point(dp2px(150),dp2px(100));
    //图像上的点的集合,用链表方便增删
    private int mWaveMaxLength = 180;
    private List<Point> mWavePoints = new LinkedList<>();


绘制


画圆

添加第一个大圆:

private void init() {
        Circle circle = new Circle(mMainColor);
        circle.setmIncreaseDegree(mCircleIncreaseDegree);
        circle.setmCurrentDegree(mCircleStartDegree);
        circle.setRadius(mLargeRadius);
        circle.setmCenterPoint(mCircleCenter);

        circles.add(circle);
    }

添加圆:

    public void addCircle(Circle circle){
        int mMinRadius = 2;
        if (circles.size() > 0){
            mMinRadius = circles.get(circles.size() - 1).getRadius();
            if (mMinRadius <= 1) return;
        }
        circle.setRadius(circles.get(circles.size() - 1).getRadius()/3);
        circle.setmIncreaseDegree(circles.get(circles.size() - 1).getmIncreaseDegree() * 3);
        circles.add(circle);
    }

画圆:

    private void drawCircle(Canvas canvas) {
        canvas.save();
        initPaint();
        for (int i = 0; i < circles.size(); i++) {
            Circle circle = circles.get(i);
            //依次设置大圆动点为小圆圆心
            if (i == 0) {
                circle.setmCenterPoint(new Point(dp2px(50),dp2px(100)));
            }else {
                circle.setmCenterPoint(circles.get(i - 1).getmMovePoint());
            }
            initCirclePaint();
            //根据圆的颜色设置画笔
            mPaint.setColor(circle.getColor());
            canvas.drawCircle(circle.getmCenterPoint().x,circle.getmCenterPoint().y,
                    circle.getRadius(),mPaint);
            //根据动点旋转角度求坐标
            int movePointX = (int) (circle.getmCenterPoint().x + circle.getRadius() * Math.cos(Math.toRadians(circle.getmCurrentDegree())));
            int movePointY = (int) (circle.getmCenterPoint().y + circle.getRadius() * Math.sin(Math.toRadians(circle.getmCurrentDegree())));
            circle.setmMovePoint(new Point(movePointX,movePointY));
            //重设当前旋转角度
            int currentDegree = (circle.getmCurrentDegree() - circle.getmIncreaseDegree()) % 360;
            circle.setmCurrentDegree(currentDegree);
            //绘制圆心到动点连线
            canvas.drawLine(circle.getmCenterPoint().x,circle.getmCenterPoint().y,
                    movePointX,movePointY,mPaint);
        }
        canvas.restore();
    }

画函数图像

    private void drawWave(Canvas canvas) {
        //最外圈圆的动点坐标
        Point movePoint = circles.get(circles.size() - 1).getmMovePoint();
        //设置图像最左侧一点的纵坐标
        mOriginWavePoint.y = movePoint.y;
        //图像最长为180个像素
        if (mWavePoints.size() >= 180){
            mWavePoints.remove(0);
        }
        mWavePoints.add(new Point(mOriginWavePoint));
        //画一个点
        initPointPaint();
        canvas.drawPoint(mOriginWavePoint.x, mOriginWavePoint.y,mPaint);
        canvas.drawLine(movePoint.x,movePoint.y, mOriginWavePoint.x, mOriginWavePoint.y,mPaint);

        Path path = new Path();
        path.moveTo(mWavePoints.get(0).x,mWavePoints.get(0).y);
        for (int i = mWavePoints.size() - 1 ; i > 0; i --){
            path.lineTo(mWavePoints.get(i).x + mWavePoints.size() - i,mWavePoints.get(i).y);
        }
        canvas.drawPath(path,mPaint);
    }

附上源码:源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,265评论 25 707
  • 忘忧炸鸡店的生意很好,从早到晚食客络绎不绝,这要归功于炸鸡店门前有一只卡通人偶推销员。 推销员在不同的卡通人物之间...
    谁说曲高和寡阅读 545评论 1 4
  • 我在h市生活了六年,四年大学,随后两年也在h市工作。每每有新朋友问起我是哪里人,住在哪里时,都有几分讶异,因为我的...
    素白姑娘阅读 1,221评论 1 2
  • 微。 以上是文章正文,只有一个字。 后记:之前对自己说,每天写一篇文章,今天的文章就只有上面的一个字——“微” 这...
    简单最上乘阅读 436评论 1 1
  • 谈恋爱太费时间。现在是把睡眠时间压缩来填补过去的亏空,还得把周末也压上。生活节奏完全打乱,很多时间段身不由己,需要...
    枫蝶情阅读 190评论 2 6