锯齿形斜纹组织图:
分析:
前半齿长度k,表示山谷到山峰的列数,也就是锯齿的宽度;
锯齿飞数s,表示山峰到山峰的行数,也就是锯齿的高度。
起始点相差4格,也就是第一部分整体向上移动4格即可得到第二部分,同样道理,第二部分向上移动4格即可得到第三部分
一、求出N1和N2
其中W为以一个完整循环中的锯齿数;V为一个锯齿内的经纱根数。
锯齿形之所以有个上升的趋势,是因为下降的高度和上升的高度有一个差即S,也就是少下降了S根,故上升的山峰高度差为S。
核心代码如下:
a=N1;b=s;while(a!=b) //当a==b时结束{if(a>b) //如果a>b,则a=a-b{a=a-b;}else //否则b>a,b=b-a{b=b-a;}}w=N1/a;v=(2*k-2)-s;N2=w*v;printf("w:%d\n",w);printf("v:%d\n",v);printf("N1:%d\n",N1);printf("N2:%d\n",N2);
效果图如下:
二、求F1第一段锯齿
可以把整体分为多个部分,每个锯齿的行为N1,列为V。即每一个锯齿都为N1×V的子矩阵,最终的组织矩阵就是多个子矩阵并列即可。
为了形成锯齿,K和S之间必须满足以下关系:
1,对第1列元素赋值
,其中i=1,2,3…,N1;j=2,3,4…,K
2,对第2到k列进行赋值
,其中i=2,3…,N1;j=2,3,4…,K
3,对第k+1列到V列进行赋值
Ⅰ转变飞数f,由正转为负:
Ⅱ之后再进行赋值,i=1,2,3,…,N1;j=K+1,K+2,…,V;
核心代码如下:
/*
对第1列进行赋值
*/i=1;//先对第一列赋值,从第一列的第一行开始for(j=0;j<=m-1;j++){while(c[j]>0){x[N1-i+1][1]=1;//因为是分子,所有值都赋值为1c[j]--;i++;}while(d[j]>0){x[N1-i+1][1]=0;//因为是分母,所有值都赋值为0d[j]--;i++;}}/*
对第2列到第k列 进行赋值
*/for(j=2;j<=k;j++){for(i=1;i<=N1;i++){if((i+f)>N1) x[i][j] = x[i+f-N1][j-1];else x[i][j]=x[i+f][j-1];}}f=N1-f;//求kj列到N2列右半部分的飞数需要将负值转变为正数
/*
对第k+1列到V列 进行赋值
*/for(j=k+1;j<=v;j++){for(i=1;i<=N1;i++){if((i+f)>N1) x[i][j] = x[i+f-N1][j-1];else x[i][j]=x[i+f][j-1];}}
效果图如下:
三、根据F1,求F2第二段锯齿以及剩余的锯齿的值
锯齿飞数s为正向上移动;s为负向下移动
,其中i=1,2,…, N1;j=1,2,…,V
优化公式:
,其中
i=1,2,....,N1;j=1,2,...,v;k=1,2,...,w-1;
程序流程图如下:
四、最终优化代码如下:
#include <iostream>
#include<stdio.h>
using namespace std;int main()
{int i,j,N1,N2,m,w,v,k,s,a,b,f;int c[10],d[10],x[100][100]={0};printf("please input m:");scanf("%d",&m);for(i=0;i<m;i++){printf("please input C[%d]:",i+1);scanf("%d",&c[i]);printf("please input D[%d]:",i+1);scanf("%d",&d[i]);}printf("please input K:");scanf("%d",&k);printf("please input S:");scanf("%d",&s);printf("please input f:");scanf("%d",&f);N1=0;for(i=0;i<=m-1;i++){N1=N1+c[i]+d[i];}/*
求N1和s的最大公约数
*/a=N1;b=s;while(a!=b) {if(a>b) {a=a-b;}else {b=b-a;}}w=N1/a;v=(2*k-2)-s;N2=w*v;/*
对第1列进行赋值
*/i=1;//先对第一列赋值,从第一列的第一行开始for(j=0;j<=m-1;j++){while(c[j]>0){x[N1-i+1][1]=1;//因为是分子,所有值都赋值为1c[j]--;i++;}while(d[j]>0){x[N1-i+1][1]=0;//因为是分母,所有值都赋值为0d[j]--;i++;}}/*
对第2列到第k列 进行赋值
*/for(j=2;j<=k;j++){for(i=1;i<=N1;i++){if((i+f)>N1) x[i][j] = x[i+f-N1][j-1];else x[i][j]=x[i+f][j-1];}}f=N1-f;
/*
对第k+1列到V列 进行赋值
*/for(j=k+1;j<=v;j++){for(i=1;i<=N1;i++){if((i+f)>N1) x[i][j] = x[i+f-N1][j-1];else x[i][j]=x[i+f][j-1];}}for(k=1;k<=w-1;k++){for(j=1;j<=v;j++){for(i=1;i<=N1;i++){if(i+s>N1){x[i][k*v+j]=x[i+s-N1][(k-1)*v+j];}else x[i][k*v+j]=x[i+s][(k-1)*v+j];}}}/*
输出二维数组a[i][j]
*/for(i=1;i<=N1;i++){for(j=1;j<=N2;j++){printf("%5d",x[i][j]);}printf("\n");}getchar();return 0;
}
运行结果如下: