三角剖分

import java.lang.Math.*; 

import java.util.ArrayList;

import java.util.List;

import java.io.*; 

public class a

{

    public double duobianxing[][]=new double[8][8];//存贮多边形,每天边和弦的长度

    public double t[][]=new double[8][8];

    public int s[][]=new int[8][8];

    public List  dian = new ArrayList();

    public static void main(String args[])

    {

        a a1=new a();

a1.init();

if(a1.isduobianxing()) {

        a1.setdoubianxing();

        a1.printduobianxing();

        a1.minWeightTrangulatian(8,a1.t,a1.s);

        a1.prints();

}

    }

    

    //将坐标点添加进来

    public  void init(){

dian.add(new b(8.0,26.0));

dian.add(new b(0,20.0));

dian.add(new b(0,10.0));

dian.add(new b(10.0,0));

dian.add(new b(22.0,12.0));

dian.add(new b(27.0,21.0));

dian.add(new b(15.0,26.0));

}

    

    public void setdoubianxing()//设置多边形值,测试形状为梯形,左边为直角,右边为45度角,上边1,高1,底边为2

    {

        for (int i=0;i<8;i++)

        {

          //  doubianxiang[i][]=new double [5];

            for (int j=0;j<8;j++)

            {

                 duobianxing[i][j]=0;

            }

        }

        

        for(int i=1;i<7;i++)

         for(int j=i+1;j<8;j++)

         {

         b diani = (b) dian.get(i-1);

         b dianj = (b) dian.get(j-1);

         duobianxing[i][j] = len(diani.x,diani.y,dianj.x,dianj.y);

         }

    }

    

    public static double len(double x1,double y1,double x2,double y2){

     return java.lang.Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

    }

    

    public double w(int i,int j,int k)//权重为三边之和

    {

        // System.out.println(duobianxing[i][j]+"        "+duobianxing[i][k]+"          "+duobianxing[j][k]);

        return duobianxing[i][j]+duobianxing[i][k]+duobianxing[j][k];

    }

    public  void minWeightTrangulatian(int n,double [][]t,int [][]s)//求最优三角剖分

   {

        for (int i=1;i<8;i++) t[i][i]=0;

        for (int r=2;r<=n;r++)

            for (int i=1;i<n-r+1;i++)

            {

                int j=i+r-1;   

                t[i][j]=t[i+1][j]+w(i-1,i,j);

                System.out.println("第一种可能:t("+(i+1)+"  ,"+j+")    + w("+(i-1)+","+i+","+j+")");

                 //   System.out.println(t[i+1][j]+"   "+w(i-1,i,j));

                s[i][j]=i;

                for (int k=i+1;k<i+r-1;k++)

                {

                    double u=t[i][k]+t[k+1][j]+w(i-1,k,j);

                    System.out.println("寻找其他可能"+i+","+k+"="+t[i][k]+"    "+(k+1)+","+k+"="+t[k+1][j]+"     "+(i-1)+"   "+k+"   "+j);

                    if (u<t[i][j])

                    {

                         System.out.println("                             "+t[i][j]+">    "+u);

                         t[i][j]=u;s[i][j]=k;

                    }

                 }

                 System.out.println(i+"  "+j);

                 printresult();

                 System.out.println("****************************************************************************");

              }

    }

    public void printresult()

    {

        System.out.println("--------------------");

        System.out.println("    1      2    3    4     5     6     7     ");

        System.out.println("");

        for (int i=1;i<8;i++)

        {

          //  doubianxiang[i][]=new double [5];

            System.out.print(i+"   ");

            for (int j=1;j<8;j++)

            {

                System.out.print(Math. floor(t[i][j]*10)/10+"   ");

            }

            System.out.println();

        }         

        System.out.println("--------------------");

    }

    public void printduobianxing()

    {

        System.out.println("--------------------");

        System.out.println("    1      2    3    4     5     6     7     ");

        System.out.println("");

        for (int i=1;i<8;i++)

        {

          //  doubianxiang[i][]=new double [5];

            System.out.print(i+"   ");

            for (int j=1;j<8;j++)

            {

                 System.out.print(Math.floor(duobianxing[i][j]*10)/10+"   ");

            }

            System.out.println();

         }         

         System.out.println("--------------------");

    }

    

    public void prints()

    {

        System.out.println("--------------------");

        System.out.println("    1      2    3    4     5     6     7     ");

        System.out.println("");

        for (int i=1;i<8;i++)

        {

          //  doubianxiang[i][]=new double [5];

            System.out.print(i+"   ");

            for (int j=1;j<8;j++)

            {

                 System.out.print(Math. floor(s[i][j]*10)/10+"   ");

            }

            System.out.println();

         }         

         System.out.println("--------------------");

    }

    

    public boolean isduobianxing(){

     boolean ff = true;

//System.out.println(isTuuobianxing(new b(1,1),new b(2,2),new b(4,5)));

for(int i=0;i<dian.size()-1;i++) {

int j = i+1;//标示第i个点的下一个点

b diani = (b) dian.get(i);

b dianj = (b) dian.get(j);

double flag = 0;//标示是否所有的点都在直线的一边

int count  = 0;

System.out.println("第"+(i+1)+"个点和第"+(j+1)+"个点构成的直线为:y="

+ (diani.y-dianj.y)/(diani.x-dianj.x) + "x+" + 

(diani.x*dianj.y-dianj.x*dianj.y)/(diani.x-dianj.x));

for(int k=0; k<dian.size();k++) {

if(k==i||k==j)

continue;

b diank = (b) dian.get(k);

if(count == 0)

flag = isTuuobianxing(diani,dianj,diank);

else {

if(flag*isTuuobianxing(diani,dianj,diank)<0) {

System.out.println("第"+(k-1)+"个点和第"+k+"个点不在同一边!此多边形不是凸多边形");

ff = false;

break;

}

flag = isTuuobianxing(diani,dianj,diank);

if(flag > 0)

System.out.println("第"+k+"个点在此直线的正侧");

else

System.out.println("第"+k+"个点在此直线的负侧");

}

count++;

}

}

if(ff == true)

System.out.println("此多边形为凸多边形!");

return ff ;

    }

    

    public static double isTuuobianxing(b point1,b point2, b point3) {

return point3.y - (point1.y-point2.y)/(point1.x-point2.x)*point3.x - (point1.x*point2.y 

-point2.x*point1.y)/(point1.x-point2.x);

}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值