大家好,关于安卓画图软件源码分享网站推荐很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于安卓绘图软件下载的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
零、前言
这篇是为了下一篇做点铺垫,也是来复习一些数学基础,本篇属于休闲娱乐,不要太较真,小科普一下,不喜勿喷。本文知识点前4点你可以随便看看,但第5点非常重要,本文源码见捷文规范
本文知识点:
数学函数的概念直角坐标系的下函数图形极坐标下的函数图象参数方程下的函数图形正弦函数的详细分析(为下一篇文章做铺垫)
一、数学函数的概念:
1.高中数学必修1:
设A,B为非空的数集,如果按照某种确定的对应关系f,\n使对于集合A中的任意的任意一个数x,在集合B中都有唯一确定的数f(x)和它对应,\n那么就称”f:A→B”为从集合A到集合B的一个函数,记作:\ny=f(x),x∈A\n其中,x叫做自变量,x的取值范围叫做函数的[定义域]\n与x的值对应的y值叫做函数值,函数值的集合{f(x)|x∈A}叫做函数的[值域]\n
2.大学高等数学
设数集D?R,则称映射f:D→R为定义在D上的函数,通常简记为\ny=f(x),x∈D\n其中x称自变量,y称因变量,D称定义域,记作Df,即Df=D.\n值域:Rf=f(D)={y|y=f(x),x∈D}\n
3.映射:
设X,Y是两个非集合,如果存在一个法则f,使的对X中的每个元素x,\n按法则f,在Y中有唯一确定的元素y与之对应,则称f为X到Y的映射,记作\nf:X→Y\n其中y称为元素x(在映射f下)的像,并记作f(x),即y=f(x)\n而元素x称为元素y(在映射f下)的原像\n
二、直角坐标系的下函数图形
这里只是模拟函数,然后绘制出可视的图象
数学中的实数是连续的,这里在屏幕中将像素作为基本的单元
绘图核心:点集成线,单点半径1px
自变量:x
定义域:Df用集合Set表示
函数关系:函数f(x)
点集用Map表示,x→y
0.网格与坐标系的绘制
网格和坐标系我已经封装,初始View如下:
publicclassMathViewextendsView{\nprivatePointmCoo=newPoint(500,700);//坐标系\nprivatePicturemCooPicture;//坐标系canvas元件\nprivatePicturemGridPicture;//网格canvas元件\nprivatePaintmHelpPint;//辅助画笔\nprivatePaintmPaint;//主画笔\nprivatePathmPath;//主路径\npublicMathView(Contextcontext){\nthis(context,null);\n}\npublicMathView(Contextcontext,@NullableAttributeSetattrs){\nsuper(context,attrs);\ninit();//初始化\n}\nprivatevoidinit(){\n//初始化主画笔\nmPaint=newPaint(Paint.ANTI_ALIAS_FLAG);\nmPaint.setColor(Color.BLUE);\nmPaint.setStrokeWidth(2);\nmPaint.setStyle(Paint.Style.STROKE);\nmPaint.setStrokeCap(Paint.Cap.ROUND);\n//初始化主路径\nmPath=newPath();\n//初始化辅助\nmHelpPint=HelpDraw.getHelpPint(Color.RED);\nmCooPicture=HelpDraw.getCoo(getContext(),mCoo);\nmGridPicture=HelpDraw.getGrid(getContext());\n}\n@Override\nprotectedvoidonDraw(Canvascanvas){\nsuper.onDraw(canvas);\nHelpDraw.draw(canvas,mGridPicture,mCooPicture);\ncanvas.save();\ncanvas.translate(mCoo.x,mCoo.y);\ncanvas.scale(1,-1);//y轴向上\ncanvas.restore();\n}\n
具体细节这里不说了,详见:Android关于Canvas你所知道的和不知道的一切,或源码
1.一次函数:y=x,定义域[-200,300]
1.1:几个成员变量
privateTreeSet<Float>Df=newTreeSet<>();//定义域\nprivateMap<Float,Float>funMap=newHashMap<>();//映射表\nprivatePaintmTextPaint;//文字画笔\n
1.2:初始化定义域
/**\n*初始化定义域\n*/\nprivatevoidinitDf(){\nfor(floati=-200;i<=300;i++){\nDf.add(i);//初始化定义域\n}\n}\n
1.3:对应法则fx
/**\n*对应法则\n*@paramx原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatx){\nfloaty=x;\nreturny;\n}\n
1.4:遍历定义域,将原像x和像f(x)加入映射表
/**\n*遍历定义域,将原像x和像f(x)加入映射表\n*/\nprivatevoidmap(){\nDf.forEach(x->{\nfunMap.put(x,f(x));\n});\n//添加所有点\n}\n
1.5:绘制映射表
/**\n*绘制映射表\n*@paramcanvas画笔\n*@parammap点集映射表\n*/\nprivatevoiddrawMap(Canvascanvas,Map<Float,Float>map){\nmap.forEach((k,v)->{\ncanvas.drawPoint(k,v,mPaint);\n});\n}\n
2.绝对值函数:y=|x|,定义域[-200,300]
只需改一点
/**\n*对应法则\n*@paramx原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatx){\nfloaty=Math.abs(x);\nreturny;\n}\n
3.二次函数,定义域[-200,300]
/**\n*对应法则\n*@paramx原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatx){\nfloaty=(x-100)*(x-100)/200+100;\nreturny;\n}\n
4.对数函数:log10(x)为例,定义域[1,1000]
/**\n*初始化定义域\n*/\nprivatevoidinitDf(){\nfor(floati=1;i<=1000;i++){\nDf.add(i);//初始化定义域\n}\n}\n/**\n*对应法则\n*\n*@paramx原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatx){\nfloaty=(float)(100.f*Math.log10(x));\nreturny;\n}\n
5.指数函数:定义域[-400,500]
/**\n*初始化定义域\n*/\nprivatevoidinitDf(){\nfor(floati=-400;i<=500;i++){\nDf.add(i);//初始化定义域\n}\n}\n/**\n*对应法则\n*\n*@paramx原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatx){\nfloaty=100*(float)Math.pow(Math.E,x/300f);\nreturny;\n}\n
6.正弦函数:定义域[-360°,450°]
/**\n*初始化定义域\n*/\nprivatevoidinitDf(){\nfor(floati=-360;i<=450;i++){\nDf.add(i);//初始化定义域\n}\n}\n/**\n*对应法则\n*\n*@paramx原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatx){\nfloaty=(float)(100*Math.sin(Math.PI/180*x));\nreturny;\n}\n
经历过上面几个函数的绘制,不难发现,只有更改对应法则,即函数关系式就可以了
三、极坐标下的函数图象
1).寻找角度thta和长度p的函数关系
2).使用极坐标与直角坐标系的转换关系来绘制点集
1.笛卡尔心型线:ρ=100*(1-cosθ)
/**\n*初始化定义域\n*/\nprivatevoidinitDf(){\nfor(floati=1;i<=360;i++){\nDf.add(i);//初始化定义域\n}\n}\n/**\n*绘制映射表\n*\n*@paramcanvas画笔\n*@parammap点集映射表\n*/\nprivatevoiddrawMap(Canvascanvas,Map<Float,Float>map){\nmap.forEach((thta,p)->{\nLog.e(TAG,”drawMap:”+p+thta);\ncanvas.drawPoint((float)(p*Math.cos(thta)),(float)(p*Math.sin(thta)),mPaint);\n});\n}\n/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatthta){\nfloatp=(float)(100*(1-Math.cos(thta)));\nreturnp;\n}\n/**\n*遍历定义域,将原像x和像f(x)加入映射表\n*/\nprivatevoidmap(){\nDf.forEach(x->{\nfloatthta=(float)(Math.PI/180*x);\nfunMap.put(thta,f(thta));\n});\n//添加所有点\n}\n
2.四叶草:ρ=100*(1-4*sinθ)
/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatthta){\nfloatp=(float)(100*(1-Math.sin(4*thta)));\nreturnp;\n}\n
3.画着玩:ρ=(e^(cosθ)-2cos(4θ)+[sin(θ/12)]^5)*100
/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatthta){\nfloatp=(float)(100f*(Math.pow(Math.E,Math.cos(thta))-2*Math.cos(4*thta)+Math.pow(Math.sin(thta/12),5)));;\nreturnp;\n}\n
4.涡旋线:ρ=a*θ
/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatthta){\nfloatp=30*thta;\nreturnp;\n}\n
5.极坐标下的圆
/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@return像(因变量)\n*/\nprivatefloatf(Floatthta){\nfloatp=200;\nreturnp;\n}\n
四、参数方程下的函数图象
1.双曲线:x=a/cosα,y=btanα
/**\n*初始化定义域\n*/\nprivatevoidinitDf(){\nfor(floati=0;i<=360;i++){\nDf.add(i);//初始化定义域\n}\n}\n/**\n*绘制映射表\n*\n*@paramcanvas画笔\n*@parammap点集映射表\n*/\nprivatevoiddrawMap(Canvascanvas,Map<Float,Float>map){\nmap.forEach((k,v)->{\ncanvas.drawPoint(k,v,mPaint);\n});\n}\n/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@returny像(因变量)\n*/\nprivatefloaty(Floatthta){\nfloaty=(float)(100*Math.tan(thta));\nreturny;\n}\n/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@returnx像(因变量)\n*/\nprivatefloatx(Floatthta){\nfloatx=(float)(200/Math.cos(thta));\nreturnx;\n}\n/**\n*遍历定义域,将原像x和像f(x)加入映射表\n*/\nprivatevoidmap(){\nDf.forEach(x->{\nfloatthta=(float)(Math.PI/180*x);\nfunMap.put(x(thta),y(thta));\n});\n//添加所有点\n}\n
2.椭圆:x=a*cosα,y=bsinα
/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@returny像(因变量)\n*/\nprivatefloaty(Floatthta){\nfloaty=(float)(300*Math.sin(thta));\nreturny;\n}\n/**\n*对应法则\n*\n*@paramthta原像(自变量)\n*@returnx像(因变量)\n*/\nprivatefloatx(Floatthta){\nfloatx=(float)(400*Math.cos(thta));\nreturnx;\n}\n
3.参数方程:双钮线x=a√(cos2θ)cosθ,y=a√(cos2θ)sinθ
/**\n*对应法则:y=a√(cos2θ)sinθ\n*\n*@paramthta原像(自变量)\n*@returny像(因变量)\n*/\nprivatefloaty(Floatthta){\nfloaty=(float)(200*Math.sqrt(Math.cos(2*thta))*Math.sin(thta));\nreturny;\n}\n/**\n*对应法则:x=a√(cos2θ)cosθ\n*\n*@paramthta原像(自变量)\n*@returnx像(因变量)\n*/\nprivatefloatx(Floatthta){\nfloatx=(float)(200*Math.sqrt(Math.cos(2*thta))*Math.cos(thta));\nreturnx;\n}\n
五、分析与优化
1.分析
你可能已经吐槽了:什么鬼,怎么后面都是断断续续的点拼成的
等等…先别急,我们来看看这幅图能说明什么?
先看一下定义域:[-360,450],共810个点,每个点半径1px,每个点横向距离1px
点密集则说明相邻两点间的dy很小,相反,稀疏则说明相邻两点间的dy很大
也就是密集说明函数变化的幅度小,稀疏说明函数变化的幅度大
当相邻两点距离大于圆的直径(2px)时,视觉上会看出两个点,即不连续。
2.分析总结
为了方便描述,这里定义了几个概念
如果把一条完美的函数曲线看作P,\n那所有现实中(纸、屏幕)的函数图象P’都是对P的取点模拟,\n从P上取点的行为称为[取样],\n采样的个数称为[取样总数],\n取样的相邻两点xn,xn+1间的距离称为[取样距离dxn]\n当每个dxn值都相等的时,称为[等距采样]\n两个样本点pn,pn+1之间的距离称为[样本距离dpn]\n
3.看一下连续的点有哪些
在加入点集时过滤掉相邻两点间距离大于直径的点
/**\n*两点间的距离\n*@return\n*/\nprivatefloatdis(floatx0,floaty0,floatx1,floaty1){\nreturn(float)Math.sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));\n}\n/**\n*遍历定义域,将原像x和像f(x)加入映射表\n*/\nprivatevoidmap(){\nDf.forEach(x->{\nfloatdis=dis(x,f(x),x+1,f(x+1));//每相邻两点间距离\nif(dis<mLineWidth&&dis>mLineWidth/2){\nfunMap.put(x,f(x));\n}\n});\n
4.不行连续的点处理思路:
思路也就是在间距处再取样
/**\n*遍历定义域,将原像x和像f(x)加入映射表\n*/\nprivatevoidmap(){\nDf.forEach(x->{\nfloatdis=dis(x,f(x),x+1,f(x+1));//每相邻两点间距离\nif(dis<mLineWidth&&dis>mLineWidth/2){\nfunMap.put(x,f(x));\n}elseif(dis>mLineWidth){\nfloatnum=dis/mLineWidth;//在切割数\nfor(floatdi=0;di<=num;di+=(1.f/num)){\nx+=di;\nfunMap.put(x,f(x));\n}\n}\n});\n//添加所有点\n}\n
六、正弦函数的详细分析
1.正弦函数简介
其中A,ω,φ,k是常数,且ω≠0\n振幅:A\n角频率:ω\n周期:T=2π/ω\n频率:f=1/T=ω/2π\n相位:ωx+φ\n初相:φ\n平衡线:y=k\n波峰:最大值|A|\n波谷:最小值-|A|\n
2.振幅A:离开平衡位置的最大距离
下面横轴的每格代表90°,化为弧度制表示即:π/2,每四格是360°,即2π
2.1:A=300
2.2:A=100
2.3:振幅的作用
决定正弦曲线的波峰与波谷,形象来说就是”高矮”\n振幅越大,波峰越高,波谷越低,每个周期的图象显得”高”\n
3.角频率ω:单位时间内变化的相角弧度值
3.1:ω=2
3.2:ω=5
3.3:角频率的作用
决定正弦曲线的周期,形象来说就是”胖瘦”\n角频率越大,周期越小,每个周期的图象显得”瘦”\nω=2周期:T=2π/ω=π从图中看,每两格一周期,即π\n频率:f=1/T=1/π\n
4.初相φ:x=0时的相位
4.1:φ=π/6
4.2:φ=π/2
4.3:振幅的作用
相位决定了标准正弦函数的左右偏移:正左偏,负右偏,偏移量:φ/ω\n
5.平衡值k:决定平衡线的位置
5.1:k=100
5.2:k=200
5.3:平衡值的作用
平衡值决定标准正弦函数的上下偏移:正上偏,负下偏,偏移量:k\n
现在对于几个正弦函数的参数值已经有了一点了解,本篇结束
附录:一些常用符号:
←↑→↓∪∩??∈∝??∞θρφπαβγημζΩ
后记:捷文规范
1.本文成长记录及勘误表
项目源码日期备注V0.1-github2018-1-2Android绘制函数图象及正弦函数的介绍
2.更多关于我
笔名QQ微信爱好张风捷特烈1981462002zdl1994328语言我的github我的简书我的掘金个人网站
3.声明
1—-本文由张风捷特烈原创,转载请注明
2—-欢迎广大编程爱好者共同交流
3—-个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4—-看到这里,我在此感谢你的喜欢与支持
关于安卓画图软件源码分享网站推荐,安卓绘图软件下载的介绍到此结束,希望对大家有所帮助。
