java如何画曲线图?在线等!!
已知一个平面内的几个点(最多有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




