一种简单的曲线算法

算法非常简单,我就不说原理了,直接贴代码:

//曲线测试函数
public void curvetest(Graphics g)
{
java.util.List<Point> p=new ArrayList<Point>();
//曲线的顶点坐标
p.add(new Point(124,459));
p.add(new Point(207,360));
p.add(new Point(315,358));
p.add(new Point(340,456));
p.add(new Point(438,354));
p.add(new Point(534,342));
p.add(new Point(548,241));
p.add(new Point(440,169));
for(int i=0;i<p.size()-1;i++)
{
   g.drawLine((int)p.get(i).getX(),(int)p.get(i).getY(),(int)p.get(i+1).getX(),(int)p.get(i+1).getY());
}
g.setColor(Color.blue);
java.util.List<Point> p1=this.curve(p);
//画曲线
for(int i=0;i<p1.size();i++)
{
   g.drawLine((int)p1.get(i).getX(),(int)p1.get(i).getY(),(int)p1.get(i).getX(),(int)p1.get(i).getY());
}
}
//曲线函数
    public java.util.List<Point> curve(java.util.List<Point> p)
    /*
     * 根据传入的顶点坐标,返回曲线上的点。
     * 调用的函数有:v3curve、mvertex。
     */
    {
    java.util.List<Point> p_out=new ArrayList<Point>();        //保存计算出来曲线上的顶点坐标
    java.util.List<Point> p_in=new ArrayList<Point>();         //保存中间顶点坐标
    if (p.size()<=2)
    {
    return p_out;
    }
    if (p.size()==3)
    {
    this.v3curve(p,p_out);
    return p_out;
    }
    for (int j=0;j<p.size();j++)
    {
    p_in.add(p.get(j));
    if (j>=1 && (p.size()-j)>2)
    {
    p_in.add(this.mvertex(p.get(j),p.get(j+1)));
    }
    }
    this.v3curve(p_in,p_out);
    return p_out;
    }
//3个顶点曲线函数算法
public void v3curve(java.util.List<Point> p_in,
           java.util.List<Point> p_out)
{
/*
* 本曲线使用3个顶点定义一条曲线。
*/
//java.util.List<Point> pt=new ArrayList<Point>();        //保存计算出来曲线上的顶点坐标\
double x1=100,y1=100,x2=300,y2=300,x3=100,y3=400;         //3个顶点坐标
int f=(p_in.size()-1)/2;
for (int j=1;j<=f;j++)
{
if (j==1)
{
x1=p_in.get(0).getX();
y1=p_in.get(0).getY();
x2=p_in.get(1).getX();
y2=p_in.get(1).getY();
x3=p_in.get(2).getX();
y3=p_in.get(2).getY();
}
else
{
x1=p_in.get(j*2-2).getX();
y1=p_in.get(j*2-2).getY();
x2=p_in.get(j*2-1).getX();
y2=p_in.get(j*2-1).getY();
x3=p_in.get(j*2).getX();
y3=p_in.get(j*2).getY();
}
double x,y;                                            //曲线上的顶点坐标    
double tmpx1,tmpy1,tmpx2,tmpy2;                        //中间直线的坐标
double rx1,ry1;                                        //中间直线的比率
int psn=500;                                           //曲线精度
double tx1=(x2-x1)/psn,ty1=(y2-y1)/psn,tx2=(x3-x2)/psn,ty2=(y3-y2)/psn;//线段1和线段2的直线比率
for (int i=0;i<=psn;i++)
{
tmpx1=x1+i*tx1;
tmpy1=y1+i*ty1;
tmpx2=x2+i*tx2;
tmpy2=y2+i*ty2;
rx1=(tmpx2-tmpx1)/psn;
ry1=(tmpy2-tmpy1)/psn;
x=tmpx1+i*rx1;
y=tmpy1+i*ry1;
p_out.add(new Point((int)x,(int)y));
//g.drawLine((int)x, (int)y, (int)x, (int)y);
}
}
}
//计算直线的中间坐标。
public Point mvertex(Point p1,Point p2)
{
return new Point((int)(p1.getX()+(p2.getX()-p1.getX())*0.5),(int)(p1.getY()+(p2.getY()-p1.getY())*0.5));
}


运行效果截图如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值