ios 赛贝尔曲线线怎么做啊,有人知道吗

2664人阅读
Android开发高德地图部分(1)
做过地图开发的朋友都知道,对于高德或者百度地图来说,通过polylineOptions.add(point);aMap.addPolyline(polylineOptions);方法得到的地图路径是折线,而且颜色无法渐变,很难达到美观的项目需求。在我的上一个项目中,需求是行程结束后得到平滑的路径曲线,而且要有渐变色。本人开始从高德的API中找了很久也无法实现这样的需求,甚至想过自己写一个贝塞尔曲线的算法,但是水平有限只好放弃。最后采用的方法是在地图上面加一个画板,自定义一个View,通过path.quadTo(x1,
y1, x2, y2)方法实现曲线需求,通过LinearGradient实现渐变色需求。以高德地图为例,详情如下:
1.在行程结束的时候记录下形成过程中所有的定位点的坐标值,保存在实体类的集合中。代码如下:
&* 定位点的数据结构实体类
public class FileRecordData {
在主Activity中,创建FileRecordData的List集合:
ArrayList&FileRecordData& fileD
在每次定位重写的onLocationChanged方法里调用代码:
FileRecordData .lat =&aLocation.getLatitude();
FileRecordData .lon =&aLocation.getLongitude();
fileDatas.add(FileRecordData );
2.得到了所有的定位点,需要将所有的点都显示在可视化地图空间内:
Projection projection = aMap.getProjection();
public Point[]
pointzu = new Point[fileDatas.size()];
if (fileDatas != null && 0 != fileDatas.size()) {
//获得起点和终点坐标
pointstart = new LatLng(fileDatas.get(0).lat, fileDatas.get(0).lon);
pointend = new LatLng(fileDatas.get(fileDatas.size() - 1).lat,
fileDatas.get(fileDatas.size() - 1).lon);
// 设置所有maker显示在View中
if (null != fileDatas && 0 != fileDatas.size()) {
double xMax = fileDatas.get(0).lat, xMin = fileDatas.get(0).lat, yMax = fileDatas
.get(0).lon, yMin = fileDatas.get(0).
// 挑选出最大和最小的经纬度
for (int i = 0; i & fileDatas.size(); i++) {
if (fileDatas.get(i).lat &= xMax) {
xMax = fileDatas.get(i).
if (fileDatas.get(i).lat &= xMin) {
xMin = fileDatas.get(i).
if (fileDatas.get(i).lon &= yMax) {
yMax = fileDatas.get(i).
if (fileDatas.get(i).lon &= yMin) {
yMin = fileDatas.get(i).
//圈出一个能显示所有定位点的最左上、左下、右上、右下的区域的坐标
double xx = (xMax - xMin) / 5, yy = (yMax - yMin) / 5;
LatLng leftup = new LatLng(xMax + xx, yMin - yy);
LatLng leftdown = new LatLng(xMin - xx, yMin - yy);
LatLng rightup = new LatLng(xMax + xx, yMax + yy);
LatLng rightdown = new LatLng(xMin - xx, yMax + yy);
//将四个点放入可视化地图内
bounds = new LatLngBounds.Builder().include(pointstart)
.include(pointend).include(leftup).include(leftdown)
.include(rightdown).include(rightup).build();
aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 20));
aMap.getUiSettings().setMyLocationButtonEnabled(false);
aMap.getUiSettings().setZoomControlsEnabled(false);
addOverlayToMap();
3.所有定位点的坐标已经有了,将定位坐标转化为屏幕坐标:
for (int i = 0; i & fileDatas.size(); i++) {
LatLng point = new LatLng(fileDatas.get(i).lat,
fileDatas.get(i).lon);
pointzu[i] = projection.toScreenLocation(point);
4.将pointzu传到自定义的View类中。重写onMeasure和onDraw方法。
public Point[]
private Paint barP
private float x0,y0,x1,y1;//起始点和终点坐标
* 初始化画笔等
private void init() {
barPaint = new Paint();
barPaint.setColor(Color.parseColor(&#ed6731&));
barPaint.setColor(0xff15B503);
barPaint.setStrokeWidth(10);
barPaint.setAntiAlias(true);// 设置画笔为无锯齿
barPaint.setStyle(Style.STROKE);// 设置为空心
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(widthSize, heightSize);
protected void onDraw(Canvas canvas) {
Path pointPath = new Path();
if (pointzu != null) {
float firstX = (float) pointzu[0].x;
float firstY = (float) pointzu[0].y;
& * 设置曲线渐变色
LinearGradient lgGradient = new LinearGradient(x0, y0, x1, y1,
new int[] { 0xff00ff00, 0xffff0000, 0xff0000ff }, null,
TileMode.MIRROR);
barPaint.setShader(lgGradient);
& * 设置贝塞尔曲线
pointPath.reset();
pointPath.moveTo(firstX, firstY);
x0 = (float) pointzu[0].x;
y0 = (float) pointzu[0].y;
x1 = (float)pointzu[pointzu.length-1].x;
y1 = (float)pointzu[pointzu.length-1].y;
for (int n = 1; n & pointzu. n++) {
float x = (float) pointzu[n].x;
float y = (float) pointzu[n].y;
pointPath.quadTo(firstX, firstY, (firstX + x) / 2, (firstY + y) / 2);
pointPath.quadTo((firstX+(float)pointzu[pointzu.length-2].x)/2, (firstY+(float)pointzu[pointzu.length-2].y)/2, firstX, firstY);//三次贝塞尔曲线
canvas.drawPath(pointPath, barPaint);
& * 给曲线添加起点和终点图片
Bitmap bitmapStart = BitmapFactory.decodeResource(getResources(), R.drawable.riding_start_point);
Bitmap bitmapEnd = BitmapFactory.decodeResource(getResources(), R.drawable.riding_end_point);
& * 因为图片的坐标不是图片中心作为参照点的,而是从左上角作为参照点,所有需要偏移量将参照点移到图片中心。
canvas.drawBitmap(bitmapStart, x0-25, y0-34, barPaint);
canvas.drawBitmap(bitmapEnd, x1-25, y1-34, barPaint);
System.out.println(&pointzu = null&);
super.onDraw(canvas);
5.进行到上一步就可以看到地图上的平滑渐变曲线啦,不过这个例子是行程结束得到的曲线,并且地图是不能放大的,因为已经被画板盖住了;如果需求是在行驶过程中的路线变为曲线,那么需要每次定位后都将重新刷新一次自定义View,不过因为被画板盖住,所以地图依然无法放大,这一点目前还没有太好的解决办法,如果有大神知道,请留言指教,谢谢!
效果图如下:
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3213次
排名:千里之外二次贝塞尔曲线。知道起点、终点,和中间任意一个点,或者是顶点,怎么求控制点呢
我的图书馆
二次贝塞尔曲线。知道起点、终点,和中间任意一个点,或者是顶点,怎么求控制点呢
为了帮助网友解决“二次贝塞尔曲线。知道起点、终点,和中间任”相关的问题,中国学网通过互联网对“二次贝塞尔曲线。知道起点、终点,和中间任”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:二次贝塞尔曲线。知道起点、终点,和中间任意一个点,或者是顶点,怎么求控制点呢,具体解决方案如下:解决方案1:我的理解是这样的,设P0、P2分别为起点、终点,P1是控制点,B(t)为曲线上任意一点,那么求控制点P1的问题就可转化为这种数学模型:
设(x,y)为B(t)的横、纵坐标(这里x、y其实分别为自变量t的函数)
(x0,y0)为P0的横、纵坐标
(x1,y1)为P1的横、纵坐标
(x2,y2)为P2的横、纵坐标
x=(1 - t)^2 x0 + 2 t (1 - t) x1+ t^2 x2
y=(1 - t)^2 y0 + 2 t (1 - t) y1+ t^2 y2
这两个方程中,任意点(x,y)起点(x0,y0)终点(x2,y2)都已知,那么控制点(x1、y1)就可解了
唉,最近心情比较烦,闲来无事到百度上转转,说错了不要拍我啊猜你感兴趣:
与本文相关:
通过对数据库的索引,我们还为您准备了:问:coreldraw中有个贝塞尔曲线,其中贝塞尔指的是一个人?一种函数?一种公...答:贝塞尔曲线也称贝兹曲线,一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。当然在一些比较成熟的位图软件中也有贝塞尔曲...===========================================问:coreldraw中有个贝塞尔曲线,其中贝塞尔指的是一个人?一种函数?一种公...答:转载 这段时间感觉很蛋疼。。虽然各种游戏玩的很开心。。还是多少要学习一下呗。。 做了个小东西,贴出来得瑟下。。能力有限,就先这么着了。 别试图找我要任何代码之类的。。我只是个amateur,这种帖子认真你就输了。。 别试图接分。。那是不可...===========================================问:回答满意加分答:[img=/gif.latex?C^2(u)=\sum_{i=0}^{n}B^2_i(u)P_i][/img] 这里2表示该bezier曲线次数为2,[img=/gif.latex?B^2_i(u)][/img]表示2次第i个bezier基函数,[img=/gif...===========================================问:已知条件:端点1(x1,y1),断点2(x2,y2),控制点(xc,yc) 欲求结果:曲线...答:德卡斯特里奥算法可以计算贝塞尔曲线上的点C(u),u∈[0,1]。因此,通过给定一组u的值,便可以计算出贝塞尔曲线上的坐标序列,从而绘制出贝塞尔曲线。 德卡斯特里奥算法的基础就是在向量AB上选择一个点C,使得C分向量AB为u:1-u(也就是∣AC∣:∣AB∣= ...===========================================问:已知条件:端点1(x1,y1),断点2(x2,y2),控制点(xc,yc) 欲求结果:曲线...答:三次Bezier曲线需要四个控制顶点定义,两次只需要三个。Bezier曲线是B样条的特例,而B样条是NURBS的特例。现在一般的商业CAD软件曲线曲面都用NURBS。像Bezier的定义,性质在各种讲计算机辅助几何设计的书中都有,个人认为施法中老师的《计算机辅...===========================================问:corelDRAW手绘工具里的的贝塞尔工具是怎么用的?夲秂研究到现在还是吥懂....答:CorelDRAW 贝磁曲线操作的快捷键,这一点可能很少有人提及:(CD9) 在节点上双击,可以合节点变成尖角 按C键可以改变下一线段的切线方向 按S键可以改变上下两线段的切线方向 按ALT键且不松开左键可以移动节点 按CTRL这,切点方向可以根据预设空...===========================================问:corelDRAW手绘工具里的的贝塞尔工具是怎么用的?夲秂研究到现在还是吥懂....答: Bézier curve [编辑本段]【简介】贝塞尔曲线又称贝兹曲线或贝济埃曲线,一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的...===========================================我的理解是这样的,设P0、P2分别为起点、终点,P1是控制点,B(t)为曲线上任意一点,那么求控制点P1的问题就可转化为这种数学模型:设(x,y)为B(t)的横、纵坐标(这里x、y其实分...===========================================你查阅一下MSDN的PolyBezier函数,专门用来画贝塞尔曲线的,使用该函数至少需4个取样点(包含起点和终点),然后函数会将这些取样点连接成贝塞尔曲线===========================================;移动中间点(也就是移动虚拟的控制线)时,贝塞尔曲线在起始点和终止点锁定的情况下做... 可以看右图。路径可以是闭合的,没有起点或终点(如圆圈),也可以是开放的,有明显的端点...===========================================贝塞尔曲线工具。 贝塞尔曲线是应用于二维图形应用程序的数学曲线。曲线的定义有... 曲线的形状,可以看右图。路径可以是闭合的,没有起点或终点(如圆圈),也可以是开放的,...===========================================起点或终点(圆圈)也开放有明显端点(波浪线) 【CorelDRAW贝塞尔曲线使用方法】 贝塞尔曲线跟PS里钢笔意思大概差多过贝塞尔曲线没有选取功能里要切记要和轮廓工...===========================================你画的曲线需要是闭合的才可以填充,检查你的曲线的起点和终点,放大了检查,看看是不是没有闭合,如果没有闭合选中两个断开的点右键选择自动闭合,然后在从右侧点击一种颜...===========================================1、画直线最简单,在起点和结束点单击就可以了;2、画曲线(除你提到的直线外的所有问... 会出现一个控制点,进行拖动修改。贝塞尔曲线工具一定要多练,当然,当你知道怎么操作...===========================================1、画直线最简单,在起点和结束点单击就可以了; 2、画曲线(除你提到的直线外的所有... 会出现一个控制点,进行拖动修改。 贝塞尔曲线工具一定要多练,当然,当你知道怎么操...===========================================起点、终点、两个调节点(开始练习时,可以把这两点放在同一位置)。 你需要多摸索才能体会到它的调节"功能"的。需要多去实践的! Windows 附件中的【画图】里就有"贝赛尔...===========================================起点、终点、两个调节点(开始练习时,可以把这两点放在同一位置)。 你需要多摸索才... 需要多去实践的! Windows 附件中的【画图】里就有"贝赛尔曲线"工具,去试一试吧! 祝...===========================================
TA的最新馆藏【新手教程】大家都是怎么取舍贝塞尔曲线的锚点位置的?【photoshop吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:998,772贴子:
【新手教程】大家都是怎么取舍贝塞尔曲线的锚点位置的?收藏
如果你不知道什么叫贝塞尔曲线·····我建议是个人科普一下比较好,算是对创作者的一个尊重。当然,说白了就是PS或者AI的曲线路径,大家都用过钢笔抠图,钢笔抠图是一件非常累的事情,一个图,如何利用更少的锚点去把它抠出来这才是钢笔的精髓,锚点越少,曲线就越圆滑,抠出来的图也就越圆滑。说多都是废话看图:这是我给的锚点位置,我的心得是:把原物看成几何化的东西,找到端点。线段是由一段段的曲线组成的,曲线是由一段段的圆弧组成的,那我们要做的就是把圆弧跟圆弧之间的交界找出来,这个地方就是我们需要加锚点的地方。其实自己抠抠就感觉得到了,无非就是圆弧,各种圆弧。我混个经验发个帖呵呵
photoshop教程,设计大咖免费教你学photoshop,快速成为ps高手,ps菜鸟到设计大咖的指南.马上开始学习photoshop设计,提升技能,冲刺高薪工作.
我们的生活就是一条函数图象,在一个三维的空间里迂回曲折地前行着。时间决定了我们人生中的所有x取值,而行动控制着生命线前行的方向。我们能够选择的是在生命下一秒的精彩,我们能够回味的是在函数曲线上的美好,我们能够享受的是驾驭人生的快感。      ---本大帅比高调路过~~
感觉是前排.正在感受钢笔,谢谢科普
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 赛贝尔曲线 的文章

 

随机推荐