新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论SVG, GML, X3D, VRML, VML, XAML, AVALON, Batik等基于XML的图形技术,以及有关GIS的应用。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - 高级XML应用『 SVG/GML/VRML/X3D/XAML 』 → 请教svg曲线图 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7604 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 请教svg曲线图 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     agan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:56
      门派:XML.ORG.CN
      注册:2006/12/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给agan发送一个短消息 把agan加入好友 查看agan的个人资料 搜索agan在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看agan的博客楼主
    发贴心情 请教svg曲线图

    我想用.net生成svg曲线图,没找到这方面的资料,直方图跟饼图有,哪位做过能给个小例子看看,谢了!
    QQ:178266914
    E_Mail:lkwjl@sina.com

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/12/11 9:24:00
     
     wenwu2008 帅哥哟,离线,有人找我吗?巨蟹座1985-7-9
      
      
      等级:大二(研究C++)
      文章:28
      积分:290
      门派:XML.ORG.CN
      注册:2006/4/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wenwu2008发送一个短消息 把wenwu2008加入好友 查看wenwu2008的个人资料 搜索wenwu2008在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 点击这里发送电邮给wenwu2008 引用回复这个贴子 回复这个贴子 查看wenwu2008的博客2
    发贴心情 
    我用过GDI+里面的GraphicsPath类,从那里面再转成SVG的path元素,会比较简单。只是我转弧形时,算的比较复杂。我把代码发上来吧。
     public:
       //将一个SVG中的扇形转成一个Graphics中的扇形,x_axis_rotation代表长半短轴顺时针旋转的角度,large_arc_flag代表是在圆还是小圆,sweep_flag代表是顺时针还是逆时针转动。
       //假设存在严格匹配的扇形,不需要移动长半轴和短半轴
       static void SVGArcToGDI(Drawing::Drawing2D ::GraphicsPath ^tagPath,Drawing::PointF startPoint,Drawing::PointF overPoint,float rx,float ry,float x_axis_rotation,float large_arc_flag,float sweep_flag)
       {
        //第一次解会得到
        double t=2*(overPoint.Y -startPoint.Y)/ry;
        double V=Math::Pow (((overPoint.Y-startPoint.Y )/ry),2)+(overPoint.X*overPoint.X-startPoint.X*startPoint.X ) /(rx*rx);

        //方程的三个系数
        double A=4*Math::Pow ((startPoint.X-overPoint.X ),2)/Math::Pow (rx,4)+t*t/(rx*rx);
        double B=4*(startPoint.X -overPoint.X )*V/(rx*rx)-t*t*2*startPoint.X /(rx*rx);
        double C=V*V-t*t*(1-startPoint.X *startPoint.X /(rx*rx));
        //得解为椭圆的中心点,
        double PX_1,PY_1,PX_2,PY_2;
        //当半径不够时,扩大半径,以达到拟合.
        while(B*B-4*A*C<0)
        {
         rx*=1.01F;
         ry*=1.01F;
         V=Math::Pow (((overPoint.Y-startPoint.Y )/ry),2)+(overPoint.X*overPoint.X-startPoint.X*startPoint.X ) /(rx*rx);
         A=4*Math::Pow ((startPoint.X-overPoint.X ),2)/Math::Pow (rx,4)+t*t/(rx*rx);
         B=4*(startPoint.X -overPoint.X )*V/(rx*rx)-t*t*2*startPoint.X /(rx*rx);
         C=V*V-t*t*(1-startPoint.X *startPoint.X /(rx*rx));
        }
        if(B*B-4*A*C>0)
        {
         //第一组
         PX_1=((0-B)+Math::Pow ((B*B-4*A*C),0.5))/(2*A);
         PY_1=startPoint.Y -ry*Math::Pow ((1- Math::Pow ((startPoint.X -PX_1),2)/(rx*rx) ),0.5);
         if(Math::Abs ((Math::Pow ((overPoint.X -PX_1)/rx,2)+Math::Pow ((overPoint.Y -PY_1)/ry,2))-1)>0.00001)
          PY_1=startPoint.Y +ry*Math::Pow ((1- Math::Pow ((startPoint.X -PX_1),2)/(rx*rx) ),0.5);
         //第二组

         PX_2=((0-B)-Math::Pow ((B*B-4*A*C),0.5))/(2*A);
         PY_2=startPoint.Y -ry*Math::Pow ((1- Math::Pow ((startPoint.X -PX_2),2)/(rx*rx) ),0.5);
         if(Math::Abs ((Math::Pow ((overPoint.X -PX_2)/rx,2)+Math::Pow ((overPoint.Y -PY_2)/ry,2))-1)>0.00001)
          PY_2=startPoint.Y +ry*Math::Pow ((1- Math::Pow ((startPoint.X -PX_2),2)/(rx*rx) ),0.5);
        }
        else
        {
         if(B*B-4*A*C==0)
         {
          PX_1=((0-B)+Math::Pow ((B*B-4*A*C),0.5))/(2*A);
          PX_2=PX_1;
          PY_1=startPoint.Y -ry*Math::Pow ((1- Math::Pow ((startPoint.X -PX_1),2)/(rx*rx) ),0.5);
          PY_2=startPoint.Y +ry*Math::Pow ((1- Math::Pow ((startPoint.X -PX_1),2)/(rx*rx) ),0.5);
          if(Math::Abs ((Math::Pow ((overPoint.X -PX_2)/rx,2)+Math::Pow ((overPoint.Y -PY_2)/ry,2))-1)>0.00001)
           PY_2=PY_1;
          if(Math::Abs ((Math::Pow ((overPoint.X -PX_1)/rx,2)+Math::Pow ((overPoint.Y -PY_1)/ry,2))-1)>0.00001)
           PY_1=PY_2;
          //判断PY_2是否合理,如合理则继续,否则PY_2=PY_1;
         }
        }
        Drawing::PointF P1=Drawing::PointF (Convert::ToSingle (PX_1),Convert::ToSingle (PY_1));
        Drawing::PointF P2=Drawing::PointF (Convert::ToSingle (PX_2),Convert::ToSingle (PY_2));
        Drawing::PointF center;
        //为了判断四种情况,需要计算,先判断中心点在直线的左边还是右边
        double k=(P1.X -startPoint.X )*(overPoint.Y-P1.Y)-(overPoint.X-P1.X )*(P1.Y -startPoint.Y );
        if(large_arc_flag+sweep_flag==0||large_arc_flag+sweep_flag==2)//在左边
         if(k>0)
          center=Drawing::PointF (P1.X ,P1.Y );
         else
          center=Drawing::PointF (P2.X ,P2.Y );
        else
         if(k>0)
          center=Drawing::PointF (P2.X ,P2.Y );
         else
          center=Drawing::PointF (P1.X ,P1.Y );
        //得到center为最终椭圆中心
        //求两点在椭圆上的位置
        //求开始点所在的角度,确保结果大于0度
        double dx=center.X -startPoint.X ;
        double dy=center.Y -startPoint.Y ;
        double startAngle=Math::Asin(dy/Math::Pow ((dx*dx+dy*dy),0.5))*180/Math::PI ;
        if(dx>=0)
         startAngle=180-startAngle;
        else
         if(dy<0)
          startAngle+=360; 
        startAngle=360-startAngle;
        //求终点所在的角度
        dx=center.X -overPoint.X ;
        dy=center.Y -overPoint.Y ;
        double overAngle=Math::Asin(dy/Math::Pow ((dx*dx+dy*dy),0.5))*180/Math::PI ;
        if(dx>=0)
         overAngle=180-overAngle;
        else
         if(dy<0)
          overAngle+=360;    
        overAngle=360-overAngle;
        //如果是逆时钟,交换起末点
        double swepAngle=overAngle-startAngle;
        if(sweep_flag==0)
        {
         if(swepAngle>0)
          swepAngle=0-swepAngle;
        }
        else
        {
         if(swepAngle<0)
          swepAngle=0-swepAngle;
        }
        //必须保证弧的起点不变,可以使用转过负角来达到要求
        tagPath->AddArc (center.X -rx,center.Y-ry,rx*2,ry*2,Convert::ToSingle (startAngle),Convert::ToSingle (swepAngle));      
       }

    ----------------------------------------------
    人在夕阳黄昏后,陪着明月等寂寞!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/12/11 10:44:00
     
     agan 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:56
      门派:XML.ORG.CN
      注册:2006/12/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给agan发送一个短消息 把agan加入好友 查看agan的个人资料 搜索agan在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看agan的博客3
    发贴心情 
    有折线图的没有?可以线考虑不用转换成曲线的,有的话能给我发个小例子吗?从哪里取数据到是无所谓,现在没有头绪。。。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/12/11 11:06:00
     
     tamefox 美女呀,离线,快来找我吧!魔羯座1980-1-1
      
      
      威望:1
      等级:大四(每天看1小时莱昂氏)
      文章:129
      积分:1236
      门派:XML.ORG.CN
      注册:2005/7/6

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给tamefox发送一个短消息 把tamefox加入好友 查看tamefox的个人资料 搜索tamefox在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 引用回复这个贴子 回复这个贴子 查看tamefox的博客4
    发贴心情 
    其实用SVG画图,无论是饼图、折线图什么的,原理都一样。折线图相对更简单一些,你可以用类似<polyline points="100 100 200 150 300 90 400 70" fill="none" stroke="red"/>这样的语句绘制每条折线。points中的点对中的x、y坐标对应你相应的X轴和y轴的值即可

    ----------------------------------------------
    无为而无所不为
    有为而有所不为

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2006/12/16 10:14:00
     
     GoogleAdSense魔羯座1980-1-1
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 SVG/GML/VRML/X3D/XAML 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/12 12:34:00

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms