初识SVG

最近遇到一个关于彩票中奖号码展示的项目,里面有很多技术难点,其中一个就是把各开奖号码之间用线段连接起来,这是一个典型网页图形绘制问题。本文尝试讲解如何利用SVG技术实现折线图形的绘制。

我们知道,在网页中绘制图形有很多种方式,如canvas、svg、vml等都可以绘制优秀的矢量图形。关于它们的区别和适用性比较,可以参考这篇文章,本文只介绍如何使用SVG的基础知识实现我的工作目的。

首先分析下问题和解决方案

彩票号码一般都显示为圆形的小球,上面叠加一个阿拉伯数字。要把一系列小球用直线连接,需要知道每个小球的位置信息,然后用SVG的line方法画出来。

那么问题来了,我们怎么才能得到小球的位置信息呢?

一般计算机的坐标系都是以左上角为原点,横向为X轴,纵向为Y轴。SVG坐标系也不例外。

此外,我们把小球都放表格中,并规定好单元格的宽高。以表格的左上角为原点,就能轻松得到每个单元格的XY轴信息,进而得到圆心的坐标。very nice!

svg坐标系

但实际上我们只得到圆心的坐标是不行的,因为SVG层叠加在表格上面,如果用Line方法把各个圆心连接起来,会把小球上面的文字盖住。所以Line的起止坐标必须在小球的边缘上。而且,除了第一个和最后一个小球外,每个小球都要有一个画入点和一个画出点,分别指向它的上一个小球和下一个小球。

那么问题又来了,怎样才能得到这些出入点的坐标呢?

思前想后,终于把这个问题抽象为一道数学题:已知一个圆的圆心坐标和半径,有一条从圆心发出的直线,假设直线与X轴的夹角为a,求该直线与圆相交的点的坐标。

Oh My Dog!这特么解析几何啊!哥中学课本早烧香了,咋办?
zzz...


没办法,自己画吧。在纸上算啊算,电脑上测啊测,终于憋出一个公式!

想要草稿纸的自行来取

写成函数如下:
<code>
function calcPointCoor(cx,cy,r,alpha){
//cx,cy: coordination of the circle
//r: radius
//alpha: angle of line and X axis
return {x:cx + r * Math.cos(alpha),y:cy + r * Math.sin(alpha)};
}
</code>
其中cx,cy是圆心坐标,r是半径,alpha为角度。

然而如何计算两个小球之间的角度呢?

还解析几何啊!想到脑细胞会烧坏一坨,还是算了。我考虑用Snap SVG组件的angle方法来做,这个方法只要两个点的x,y坐标,就能返回他们之间的夹角。

要注意的是,给angle方法传入的参数顺序不同,得出的角度会有差别。经过测试,angle方法得出的角度值是自X轴正向顺时针增加的。这样,如果要按解析几何平面坐标系来计算的话,就需要加入或减去一个π周期来修正。

另外,还需要把角度值转换为弧度值。因为JS中Math对象的正余弦函数只接受弧度值。

经过上帝测试,最终得出以下方法:
<pre><code>
//radius , coordinations of current cicle and next circle
var r,cur_cx,cur_cy,next_cx,next_cy;

//.....

var ang = Snap.angle(next_cx,next_cy,cur_cx,cur_cy) * Math.PI / 180;

var coor1 = calcPointCoor(cur_cx,cur_cy,r, ang);

var coor2 = calcPointCoor(next_cx,next_cy,r, ang + Math.PI);

var c = svg.path("M" + coor1.x + " " + coor1.y + "L" + coor2.x + " " + coor2.y).attr({stroke:stroke_color,strokeWidth:1.5});</code></pre>

这里面的coor1是当前小球到下一个小球的画出点坐标,coor2是下一个小球的画入点坐标。

再往下就简单了,SVG中有Line方法,只要循环一下某一组中所有中奖号码的小球圆心坐标,就可以搞定一切。

但实际应用中,Path方法比Line方法更高效。因为画一段线条就得用一个Line,而Path方法只要给出d属性的M和L值,就可以在一个标签中实现N段线条,然后你就能方便地切换显示了。哈哈!

svg实现折线

总结:

  • SVG可以像使用其他HTML标签一样来灵活生成,不管你是用PHP还是JavaScript。
  • 对CSS有效的标签同样适用于SVG标签。
  • 能用组件或库的尽量用,否则死很多脑细胞

文中涉及的技术和组件哥也是现学现卖,欢迎批评指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容

  • 在React Native中使用ARTReact Native ART 究竟是什么?所谓ART,是一个在React...
    JackfengGG阅读 9,466评论 2 50
  • 一:什么是SVG? 对于SVG的定义如下: ①:SVG 指的是可伸缩矢量图形 (Scalable Vector G...
    GreenHand1阅读 792评论 0 1
  • 一.什么是SVG? SVG 指的是可伸缩矢量图形 (Scalable Vector Graphics),它用来定义...
    nightZing阅读 17,017评论 11 62
  • SVG 学习笔记 SVG是什么 SVG 指可伸缩矢量图形 (Scalable Vector Graphics) S...
    Penn_Xu阅读 953评论 0 1
  • 既然了解了运营就是做好产品与用户之间的桥梁,那么什么样的“术”可以帮我们思考的更全面,将工作做得更细致,数据更好看...
    桔次郎阅读 440评论 2 2