天天看点

一种简单的曲线算法

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

//曲线测试函数

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)

    {

    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)

{

//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));

}

运行效果截图如下:

一种简单的曲线算法
一种简单的曲线算法