分6种情况进行讨论:
分六种情况进行讨论:
1、 线与水平线所成角度为0°,在其上方生成一个角:
方法:kochcurve0_up(int x1, int y1, int x2, int y2,int k)
再分别对线段AB,CD,BE,EC进行递归操作,
kochcurve0_up(x1,y1,x3,y1,k);//对AB进行递归操作
kochcurve0_up(x4,y1,x2,y2,k); //对CD进行递归操作
kochcurve60_left(x3,y1,x5,y5,k); //对BE进行递归操作
kochcurve120_right(x5,y5,x4,y1,k); //对EC进行递归操作
最后,画出线段AB,BE,EC,CD
2、 线与水平线所成角度为120°,在其右边生成一个角:
方法:kochcurve120_right(int x5, int y5, int x4, int y1, int k)
再分别对线段EF,GC,FH,GH进行递归操作,
kochcurve0_up(x9,y9,x10,y10,k); //对FH进行递归操作
kochcurve60_right(x11,y11,x10,y10,k); //对GH进行递归操作
kochcurve120_right(x5,y5,x9,y9,k); //对EF进行递归操作
kochcurve120_right(x11,y11,x4,y1,k); //对GC进行递归操作
最后,画出线段EF,GC,FH,GH
3、 线与水平线所成角度为60°,在其右边生成一个角:
方法:kochcurve60_right(int x11, int y11, int x10, int y10,int k)
4、线与水平线所成角度为0°,在其下方生成一个角:
方法::kochcurve0_down(int x12, int y12, int x14, int y14, int k)
4、 线与水平线所成角度为60°,在其左边生成一个角:
方法:kochcurve60_left(int x3, int y1, int x5, int y5, int k)
5、 线与水平线所成角度为120°,在其左边生成一个角:
方法:kochcurve120_left(int x8, int y8, int x7, int y7, int k)
/********科赫曲线方法****************/ //在线(0度)的上方生成图形的函数 void kochcurve0_up(int x1, int y1, int x2, int y2,int k) { if(k==0){ g.drawLine(x1, y1, x2, y2); }else{ int x3=x1+Math.abs(x2-x1)/3; int x4=x1+2*Math.abs(x2-x1)/3; int x5=x1+Math.abs(x2-x1)/2; int y5=(int) (y1-Math.sqrt(3)*Math.abs(x3-x1)/2); // g.drawLine(x3, y1, x5, y5); // g.drawLine(x5, y5, x4, y2); // g.drawLine(x3, y1, x4, y1); // g.setColor(Color.BLACK); // g.drawLine(x3, y1, x4, y1); g.setColor(Color.GREEN); k--; if(k>0){ kochcurve0_up(x1,y1,x3,y1,k); kochcurve0_up(x4,y1,x2,y2,k); kochcurve60_left(x3,y1,x5,y5,k); kochcurve120_right(x5,y5,x4,y1,k); } else { g.drawLine(x3, y1, x5, y5); g.drawLine(x5, y5, x4, y2); g.drawLine(x1, y1, x3, y1); g.drawLine(x4, y1, x2, y2); } } } //在线(120度)的右侧生成图形的函数 void kochcurve120_right(int x5, int y5, int x4, int y1, int k) { int a=mathline(x5,y5,x4,y1); int x9=x5+a/6; int y9=(int) (y1-Math.sqrt(3)*a/3); int x11=x5+a/3; int y11=(int) (y1-Math.sqrt(3)*a/6); int x10=x9+mathline(x9,y9,x11,y11); int y10=y9; // g.drawLine(x9, y9, x10, y10); // g.drawLine(x11, y11, x10, y10); // g.setColor(Color.BLACK); // g.drawLine(x9-1, y9, x11-1, y11); // g.drawLine(x9+1, y9, x11+1, y11); g.setColor(Color.GREEN); k--; if(k>0){ kochcurve0_up(x9,y9,x10,y10,k); kochcurve60_right(x11,y11,x10,y10,k); kochcurve120_right(x5,y5,x9,y9,k); kochcurve120_right(x11,y11,x4,y1,k); } else { g.drawLine(x9, y9, x10, y10); g.drawLine(x11, y11, x10, y10); g.drawLine(x5, y5, x9, y9); g.drawLine(x11, y11, x4, y1); } } //在线(60度)的右侧生成图形的函数 void kochcurve60_right(int x11, int y11, int x10, int y10, int k) { if(k==0){ g.drawLine(x10, y10, x11, y11); }else{ int a=mathline(x11,y11,x10,y10); int x12=x11+a/6; int y12=(int) (y11-Math.sqrt(3)*a/6); int x13=x11+a/3; int y13=(int) (y11-Math.sqrt(3)*a/3); int x14=x12+a/3; int y14=y12; // g.drawLine(x13, y13, x14, y14); // g.drawLine(x12, y12, x14, y14); // g.setColor(Color.BLACK); // g.drawLine(x13-1,y13,x12-1,y12); // g.drawLine(x13+1,y13,x12+1,y12); g.setColor(Color.GREEN); k--; if(k>0){ kochcurve0_down(x12,y12,x14,y14,k); kochcurve120_right(x13,y13,x14,y14,k); kochcurve60_right(x11,y11,x12,y12,k); kochcurve60_right(x13,y13,x10,y10,k); } else { g.drawLine(x13, y13, x14, y14); g.drawLine(x12, y12, x14, y14); g.drawLine(x10,y10,x13,y13); g.drawLine(x11, y11, x12, y12); } } } //在线(0度)的下方生成图形的函数 void kochcurve0_down(int x12, int y12, int x14, int y14, int k) { int a=mathline(x12,y12,x14,y14); int x18=x12+a/3; int y18=y12; int x19=x12+2*a/3; int y19=y12; int x20=(x12+x14)/2; int y20=(int) (y12+Math.sqrt(3)*a/6); // g.drawLine(x19, y19, x20, y20); // g.drawLine(x18, y18, x20, y20); // g.setColor(Color.BLACK); // g.drawLine(x18,y18,x19,y19); g.setColor(Color.GREEN); k--; if(k>0){ kochcurve120_left(x18,y18,x20,y20,k); kochcurve60_right(x20,y20,x19,y19,k); kochcurve0_down(x12,y12,x18,y18,k); kochcurve0_down(x19,y19,x14,y14,k); } else { g.drawLine(x19, y19, x20, y20); g.drawLine(x18, y18, x20, y20); g.drawLine(x12, y12, x18, y18); g.drawLine(x14,y14,x19,y19); } } //在线(60度)的左侧生成图形的函数 void kochcurve60_left(int x3, int y1, int x5, int y5, int k) { int a=mathline(x3,y1,x5,y5); int x7=x3+a/6; int y7=(int) (y1-Math.sqrt(3)*a/6); int x6=x3+a/3; int y6=(int) (y1-Math.sqrt(3)*a/3); int x8=x6-mathline(x7,y7,x6,y6); int y8=y6; System.out.println("x5="+x5); System.out.println("x6="+x6); System.out.println("x7="+x7); System.out.println("x8="+x8); // g.drawLine(x7, y7, x8, y8); // g.drawLine(x8, y8, x6, y6); // g.setColor(Color.BLACK); // g.drawLine(x6-1,y6,x7-1,y7); // g.drawLine(x6,y6,x7,y7); // g.drawLine(x6+1,y6,x7+1,y7); g.setColor(Color.GREEN); k--; if(k>0){ kochcurve0_up(x8,y8,x6,y6,k); kochcurve120_left(x8,y8,x7,y7,k); kochcurve60_left(x3,y1,x7,y7,k); kochcurve60_left(x6,y6,x5,y5,k); } else { g.drawLine(x7, y7, x8, y8); g.drawLine(x8, y8, x6, y6); g.drawLine(x3, y1, x7, y7); g.drawLine(x5,y5,x6,y6); } } //在线(120度)的左侧生成图形的函数 void kochcurve120_left(int x8, int y8, int x7, int y7, int k) { if(k==0){ g.drawLine(x7,y7,x8,y8); }else{ int a=mathline(x8,y8,x7,y7); int x15=x7-a/6; int y15=(int) (y7-Math.sqrt(3)*a/6); int x16=x7-a/3; int y16=(int) (y7-Math.sqrt(3)*a/3); int x17=x15-a/3; int y17=y15; // g.drawLine(x16, y16, x17, y17); // g.drawLine(x15, y15, x17, y17); // g.setColor(Color.BLACK); // System.out.println("x15="+x15); // System.out.println("y15="+y15); // g.drawLine(x15, y15, x16, y16); // g.drawLine(x15+1, y15, x16+1, y16); // g.drawLine(x15-1, y15, x16-1, y16); g.setColor(Color.GREEN); k--; if(k>0){ kochcurve60_left(x17,y17,x16,y16,k); kochcurve0_down(x17,y17,x15,y15,k); kochcurve120_left(x8,y8,x16,y16,k); kochcurve120_left(x15,y15,x7,y7,k); } else { g.drawLine(x16, y16, x17, y17); g.drawLine(x15, y15, x17, y17); g.drawLine(x8,y8,x16,y16); g.drawLine(x7,y7,x15,y15); } } } /**********科赫曲线方法结束***********/ //计算一条直线的长度的函数 private int mathline(int x3, int y1, int x5, int y5) { int line=(int) Math.sqrt(Math.pow((x5-x3), 2)+Math.pow((y5-y1), 2)); return line; }