图表之折线图

最近项目新增一个图表数据查看的。

效果图如下

各个折线点x,y点坐标很好计算。不好画的是如何让这个折线不穿过这个空心圆

如果折线穿过空心圆,则变成下面这个样子

1.png

折线点画圆没错,但是直接连接折线点肯定和圆有相交,但是这又是个空心圆,如果是实心圆,则先画线,再画圆就可以直接覆盖在上面。but 。。产品就是这么虐心,搞个空心圆。。so。实现起来难度就大那么一丢丢了。

既然不能直接连接圆中心,那就是需计算连接圆的那个点。

3.png

现把两个圆心坐标(x1,y1),(x2,y2),两个中心点连接的线和圆1交点(dx1,dy1),和圆2的交点(dx2,dy2).显然。我们不能直接连接(x1,y1)到(x2,y2).否则就是上面图的效果。

我们要连接的就是(dx1,dy1)和(dx2,dy2).这样不会画到圆里面,并且和圆相连。

要计算dx1,dy1,dx2,dy2.则需要利用三角函数。

如上图。要计算dx1,dy1,我们已经知道圆的半径r,如果再知道角度angle。

dx1 = r*cos(angle)+x1;
dy1 = y1-r*sin(angle) ;

现在的问题就变成如何计算angle角度了?

我们利用圆1和圆2的中心点的组成的直角三角形,则可以计算angle的正切值,

tan(angle)=(y1-y2)/(x2-x1);

因此角度

angle=atan((y1-y2)/(x2-x1));

同样的dx2,和dy2也相应的

dx2 = (x2 - radius * Math.sin(angle2))  
dy2 = (y2 + radius * Math.cos(angle2))  

角度angle2的正切值

tan(angle2) = (x2-x1)/(y1-y2);  
angle2 =  atan(x2-x1)/(y1-y2); 

有同学就说了,angle2不就是90-angle吗?,计算出angle,angle2不就相当于已经计算出来了。
这里就不得不提Math里面的那些关于三角函数的方法了。 </b>

我们直接打印
System.out.println(Math.sin(30))

输出
-0.9880316240928618

咦?我们记得初中时三角函数sin30=0.5.这里的-0.988xxxxx是个什么东东
莫急,我们再看

我们再打印
System.out.println(Math.sin(Math.toRadians(30)))
输出
0.49999999999999994
好像和0.5已经很接近了。因为这里计算的都是double类型。而double类型计算会丢失精度,
so 0.5就变成了0.49999999999
这就说明Math方法里面的三角函数传入的不是我们所认为的角度,而是弧度,同样的,反切函数计算出来的也不是角度,而是弧度。
如果上面我们利用90-angle.则我们还要把计算出来的angle转换为角度,然后再把90-角度,计算的时候还要转换为弧度。比如上计算angle2计算步骤更多。

            //这里计算出来的是弧度
            double angle = Math.atan((y1-ly2)/(x2-lx1));

            float dx1 = (float) (x1 + radius*Math.cos(angle));
            float dy1 = (float) (y1 - radius*Math.sin(angle));
            double angle2 = Math.atan((x2-x1)/(y1-y2));
            float dx2=0,dy2=0;
            dx2 = (float) (x2 - radius * Math.sin(angle2));
            dy2 = (float) (y2 + radius * Math.cos(angle2));

至此。我们dx1,dx2,dy1,dy2全部都计算出来了,只要连接就可以。效果图如下

2.png

后一个圆在前一个圆上方的好像已经
完美连接了,在下方的还是会穿过圆。需区分开来

            if (y1>y2) {
                 dx2 = (float) (x2 - radius * Math.sin(angle2));
                 dy2 = (float) (y2 + radius * Math.cos(angle2));
            }else{
                dx2 = (float) (x2 + radius * Math.sin(angle2));
                dy2 = (float) (y2 - radius * Math.cos(angle2));
            }

效果图如下 再调整下线颜色和宽度。就差不多了。

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

推荐阅读更多精彩内容