CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

java如何画曲线图?在线等!!

楼主yangfengshan(前方是绝路!希望在转角!)2005-06-01 13:38:59 在 Java / J2SE / 基础类 提问

已知一个平面内的几个点(最多有8个),  
  如何用这些点画出一条圆滑的曲线?  
   
  谢谢! 问题点数:50、回复次数:14Top

1 楼kylt(kylt)回复于 2005-06-01 15:24:46 得分 10

根据这8个点,构造一个函数,然后画出这条函数线Top

2 楼yangfengshan(前方是绝路!希望在转角!)回复于 2005-06-01 15:32:27 得分 0

不一定为8个点,有可能为6个,最多为8个,动态在变化的  
  如何用点构造函数啊?点的位置是不固定的Top

3 楼rootcn(沙砾)回复于 2005-06-01 15:52:33 得分 0

怎么个圆滑法?   半圆,   椭圆,   还是有其它规则.Top

4 楼bolg(保罗)回复于 2005-06-01 15:55:04 得分 0

深奥  
  看来还是去google搜索一下有没有算法实现Top

5 楼yangfengshan(前方是绝路!希望在转角!)回复于 2005-06-01 16:20:27 得分 0

应该是平滑  
  没有其他规则,只要将这几个点连在一起,而且不能有尖角Top

6 楼DanielYWoo(绿色毒汁)回复于 2005-06-01 16:22:42 得分 0

去学数值分析吧,也叫计算方法,你说的是典型的插值问题。如果要求不高,可以用牛顿迭代或者最简单的埃特金插值。Top

7 楼DanielYWoo(绿色毒汁)回复于 2005-06-01 16:54:37 得分 0

我在大学的时候以前写过,不过是C的,很简单的,你找本数值分析的书,看完前三章就可以了,后面的龙格库塔什么的早就忘了,呵呵Top

8 楼yangfengshan(前方是绝路!希望在转角!)回复于 2005-06-01 17:28:10 得分 0

DanielYWoo(绿色毒汁):  
   
  你的说法是不是这样:  
  用   牛顿迭代或者埃特金插值   可以根据给出的几个点求出函数  
  然后再根据这个函数就可以画出曲线图了?  
  Top

9 楼jert(超级笨蛋)回复于 2005-06-01 18:32:44 得分 0

用多项式模拟,不过可能较慢!Top

10 楼DanielYWoo(绿色毒汁)回复于 2005-06-02 10:08:57 得分 40

几个   数值分析   的算法例子   VBScript的  
   
   
  '几个参考点的数据已经给出,输入参数只有   X  
   
  function   view(result,inputx)   '输出结果,同时如果<1   and   >0,就在前面补0  
  if   result<1   and   result>0   then   result=0&result  
  Response.Write   "计算结果:"&"<br>"  
  Response.Write   "F("&inputx&")="&   result  
  end   function  
   
   
  '********分段线性Lagrange插值**********  
  function   Lagrange1(inputx)  
  dim   k,i  
  dim   x,y  
  x=array("0.1","0.2","0.3","0.4")  
  y=array("0.0998","0.1987","0.2955","0.3894")  
   
  if   inputx<x(0)   then   k=0  
  if   inputx>x(3)   then   k=2  
   
  for   i=0   to   2  
      if   inputx>=x(i)   and   inputx<=x(i+1)   then   k=i  
      result=((inputx-x(k+1))/(x(k)-x(k+1)))*y(k)   +   ((inputx-x(k))/(x(k+1)-x(k)))*y(k+1)  
  next    
  result=   view(result,inputx)  
  end   function        
   
   
   
   
  '********分段三点二次Lagrange插值**********  
  function   Lagrange2(inputx)  
  dim   i,j,k,t  
  dim   x,y  
  result=0  
  x=array("0.1","0.2","0.3","0.4")  
  y=array("0.0998","0.1987","0.2955","0.3894")  
   
  if   inputx<=x(1)   then   k=0  
  if   inputx>=x(2)   then   k=1  
  if   inputx>x(1)   and   inputx<x(2)   and   abs(inputx-x(1))<=abs(inputx-x(2))   then   k=0   else   k=1  
   
   
  for   j=k   to   k+2    
  t=1  
  for   i=   k   to   k+2    
      if   i<>j   then  
      t=   t   *   (inputx-x(i))/(x(j)-x(i))  
      end   if  
  next  
      result   =   result   +   t*y(j)  
  next  
  result=   view(result,inputx)  
  end   function    
   
   
  '**********一元n点拉格朗日插值***********  
  function   Lagrange3(inputx)  
  dim   i,j  
  dim   x,y  
  result=0  
  x=array("0","0.1","0.195","0.4","0.401","0.5")  
  y=array("0.39894","0.39695","0.39142","0.38138","0.36812","0.35206")  
   
  for   j=0   to   5    
  t=1  
  for   i=0   to   5  
      if   i<>j   then  
      t=   t   *   (inputx-x(i))/(x(j)-x(i))  
      end   if  
  next  
      result   =   result   +   t   *   y(j)  
  next  
  result=   view(result,inputx)  
  end   function    
   
   
   
  '***********牛顿(Newton)插值***********  
  function   Newton(inputx)  
  dim   x,y  
  dim   i,j  
  result=0.39894  
  t=1  
  x=array("0","0.1","0.195","0.3","0.401","0.5")  
  y=array("0.39894","0.39695","0.39142","0.38138","0.36812","0.35206")  
   
  for   j=1   to   5  
  t=t*(inputx   -   x(j-1))  
  for   i=0   to   5-j    
      y(i)=(y(i+1)   -   y(i))   /   (x(i+j)   -   x(i))    
  next  
      result   =   result   +   t   *   y(0)  
  next  
      result=   view(result,inputx)  
  end   function  
   
   
  '***********埃特金(Aitken)插值***********  
  function   Aitken(inputx)  
  dim   i,j  
  dim   x,y  
  x=array("0.5","0.65","0.8","1.0")  
  y=array("0.4794","0.6052","0.7174","0.8415")  
  for   j=1   to   3  
      for   i=j   to   3  
      y(i)=y(j-1)   +   (y(i)-y(j-1))   /   (x(i)-x(j-1))*   (inputx-x(j-1))  
      next  
  next  
   
  result=   view(y(3),inputx)  
  end   function  
   
   
  '***********分段两点三次埃(厄)尔米特(Hermit)插值***********  
  function   Hermit(inputx)  
  dim   i,k  
  dim   x,y,yy  
  x=array("0.1","0.3","0.5")  
  y=array("0.099833","0.295520","0.479426")  
  yy=array("0.995004","0.995336","0.877583")  
   
  if   inputx<=x(0)   then   k=0  
  if   inputx>=x(2)   then   k=1  
  for   i=0   to   1    
  if   x(i)<=inputx   and   inputx<=x(i+1)   then   k=i  
  next  
   
  hx1=(1+2*(inputx-x(k))   /   (x(k+1)-x(k)))   *   mul((x(k+1)-inputx)   /   (x(k+1)-x(k)))  
  hx2=(1+2*(x(k+1)-inputx)   /   (x(k+1)-x(k)))   *   mul((inputx-x(k))   /   (x(k+1)-x(k)))  
  hx3=(inputx   -   x(k))*   mul((x(k+1)-inputx)/(x(k+1)-x(k)))  
  hx4=(inputx   -   x(k+1))*   mul((inputx-x(k))/(x(k+1)-x(k)))  
   
  result=y(k)*hx1   +   y(k+1)*hx2   +   yy(k)*hx3   +   yy(k+1)*hx4  
  result=   view(result,inputx)  
  end   function  
   
  function   mul(str)  
      mul=str*str    
  end   function  
   
  Top

11 楼DanielYWoo(绿色毒汁)回复于 2005-06-02 10:12:56 得分 0

不是给你一个公式,是需要N个采样点的累计计算  
  (不知道这样说你是不是容易懂,你最好先看看书)Top

12 楼yangfengshan(前方是绝路!希望在转角!)回复于 2005-06-02 11:00:27 得分 0

那是不是这样:  
  用埃特金(Aitken)插值法,算出N个采样点   Y   值,  
  然后再用直线将所有的点连在一起。  
   
  这样的话,那么采样点是需要非常非常多的,才有可能连成平滑的曲线。Top

13 楼DanielYWoo(绿色毒汁)回复于 2005-06-02 15:32:40 得分 0

你说的队,采样点需要很多,我就算是给你一个公式F(x),你要把他画出来,难道你不用采样点么?大多数计算机是光栅显示器,又不是绘图仪。我给你写了一个Java板的,Lagrange插值的,你可以看看,一个有4个给定点,公式是  
  result   =   (inputx   -   pt[k+1].x)   /   (pt[k].x   -   pt[k+1].x)   *   pt[k].y   +   (inputx   -   pt[k].x)   /   (pt[k+1].x   -   pt[k].x)   *   pt[k+1].y;  
  我的采样是5像素一个点,你看看吧  
  搂住最好不要再问我这个问题了,我说不清楚的,你真不如找本基础的书看看,其实我毕业后已经很久没看过数值分析的东西了,有些东西记不住了,说不定还是错的。  
   
  import   java.awt.Point;  
  import   java.awt.geom.Point2D;  
   
  //********分段线性Lagrange插值**********  
  public   class   Lagrange   {  
  private   Point2D.Double   pt[]   =   null;  
   
   
  public   Lagrange(Point2D.Double[]   pt)   {  
  this.pt   =   pt;  
  }  
   
  public   void   compute(int   inputx)   {  
  int   k   =   0;  
  if   (inputx   <   pt[0].x   ||   inputx   >   pt[pt.length   -   1].x)   {  
  throw   new   IllegalArgumentException("invalid   inputx,   must   in   range   of   "   +    
  pt[0].x   +   "   and   "   +   pt[pt.length   -   1].x);    
  }  
  double   result   =   0;  
  for   (int   i   =   0;   i   <   pt.length;   i++)   {  
  if   (inputx   >=   pt[i].x   &&   inputx   <=   pt[i   +   1].x)   {    
  k   =   i;  
  result   =   (inputx   -   pt[k+1].x)   /   (pt[k].x   -   pt[k+1].x)   *   pt[k].y   +    
  (inputx   -   pt[k].x)   /   (pt[k+1].x   -   pt[k].x)   *   pt[k+1].y;  
  System.out.println(inputx   +   ":"   +   result);  
  }  
  }  
   
  }  
  public   static   void   main(String[]   args)   {  
  Lagrange   algorithm   =   new   Lagrange(new   Point2D.Double[]{  
  new   Point2D.Double(50,   98),  
  new   Point2D.Double(100,   198),  
  new   Point2D.Double(150,   298),  
  new   Point2D.Double(200,   198)});  
  for   (int   i   =   50;   i   <   200;   i+=   5)   {  
  algorithm.compute(i);  
  }  
   
  }  
   
   
  }  
   
  Top

14 楼yangfengshan(前方是绝路!希望在转角!)回复于 2005-06-03 15:12:13 得分 0

非常感谢!  
  结贴了!Top

相关问题

  • 关于VB.NET画曲线图
  • Delphi 曲线图
  • 如何用java做数据曲线图?
  • 如何画曲线图(在线等待)
  • 怎样使用OWC画曲线图?
  • 有没有人用java画过动态正弦曲线图啊!100分求救,急
  • 画WEB曲线图,如何画,大家帮个忙,急!!
  • 画WEB曲线图,如何画,大家帮个忙,急!!
  • 我想在对话框里画sin()函数的曲线图...
  • 100分------求在ASp中画曲线图的程序示例!!!!!!!!!

关键词

  • 函数
  • 数值
  • view
  • inputx
  • 插值
  • 牛顿
  • lagrange
  • array
  • result
  • 埃特金

得分解答快速导航

  • 帖主:yangfengshan
  • kylt
  • DanielYWoo

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo