演算法中掃描
⑴ ZIGZAG掃描和行程編碼演算法和原理
zigzag掃描如上圖,行程編碼的基本原理是:用一個符號值或串長代替具有相同值的連續符號(連續符號構成了一段連續的「行程」。行程編碼因此而得名),使符號長度少於原始數據的長度。例如:5555557777733322221llllll
行程編碼為:(5,6)(7,5)(3,3)(2,4)(l,7)。可見,行程編碼的位數遠遠少於原始字元串的位數。
⑵ 計算機圖形學:直線段掃描轉換演算法
//數值微分演算法(DDA演算法)
#include<iostream>
using namespace std;
int main()
{
float x0,y0,x1,y1,x2,y2;
cin>>x1>>y1;
cin>>x0>>y0;
float k;
k=(y1-y0)/(x1-x0);
if(k<1)
{
x2=x1+1;
y2=y2+k;
}
else if(k>=1)
{
y2=y1+1;
x2=1/k+x1;
}
cout<<x2<<" "<<y2<<endl;
return 0;
}
//中點劃線演算法
#include<iostream>
using namespace std;
int main()
{ float x,y;
float x0,y0,x1,y1;
cin>>x0>>y0>>x1>>y1;
float a,b,c;
a=y0-y1;
b=x1-x0;
c=x0*y1-x1*y0;
float sum;
sum=a*x+b*y+c;
float Xq,Yq;
float Xm,Ym;
Xm=x0+1;
Ym=y0+0.5;
float d;
d=a*Xm+b*Ym+c;
if(d<0)
{Xq=x0+1; Yq=y0+1; }
else if(d>0)
{ Xq=x0+1; Yq=y0; }
else if(d=0)
{ Xq=x0+1; Yq=y0; }
cout<<Xq<<" "<<Yq<<endl;return 0;
}
//Bresenham演算法//有一個整數數組,請求出兩兩之差絕對值最大的值(最小的值)
#include<iostream>
using namespace std;
int jisuan(int a,int b)
{ int des=0; des=a-b; if(des<0)
des=-des;
return des;}
int main()
{ int dec=0; int max=0; int a[5]={0,2,5,9,4}; for(int i=1;i<5;i++)
{ dec=jisuan(a[i],a[i-1]); if(max<dec) max=dec; }
cout<<max<<endl;
return 0;
}
不好意思,最後一個是我寫的另一個代碼,貼錯了
⑶ 掃描演算法增加方向和減少方向算出來的值一樣嗎.
一樣
要實現區域的掃描線填充必須先確定填充區邊界與屏幕掃描線的交點位置。然後,將填充色應用於掃描線上位於填充區域內部的每一段。掃描線填充演算法利用奇偶規則識別同一內部區域(參見)。最簡單的填充區域是多邊形,因為每一掃描線和多邊形的交點可通過求解一對聯立的線性方程來獲得,其中掃描線的方程是y = 常數。
給出了多邊形區域的實心填充的掃描線過程。對每一條與多邊形相交的掃描線,與邊的交點從左向右排序,且將每一對交點之間的像素位置包括這對交點在內,設定為指定顏色。在圖4.20的例子中,與邊界的四個交點像素位置定義了兩組內部像素。這樣,填充色應用於從x=10到x = 14的5個像素和從x = 18到x = 24的7個像素。如果圖案填充應用於多邊形,則沿一條掃描線的每一像素顏色由與填充圖案重疊的位置來確定。
⑷ C語言 水平掃描演算法
我只能給一點建議:
如果你要一條線連貫,首先要將其變粗,比如用2個像素作為線段寬度.
之後,得出最底端中點
接下來,計算高一行中點位置,如果偏出太多,比如偏太左,那麼就在其低一行中點的左上方緊挨著定中點.
線段越粗,越能表示偏角.
只是一點建議 不夠專業.
⑸ 如何校驗和是通過一定的演算法掃描一個數據計算出的一個數值。用C語言
#include<stdio.h>
intQuicksum(char*str)//用指針做校驗函數的參數,來接收被校驗的字元串A;
{
intsum=0,loc=1,i,n;//sum代表校驗和,loc代表每個字元在字元串A里的位置;
char*p;
p=str;//將被校驗字元串A的地址賦值給字元指針p,用p表示位置;
n=strlen(p);//用strlen函數求出A的有效長度;
for(i=0;i<n;i++)//注意循環的次數。體會i<n的意思,保證能計算到每個字元
{
if((*p)==''){p++;loc++;continue;}//如果遇到空格,就將位置指針向後移動一個,跳過空格
//注意loc也要增加一,為了正確記錄每個字元的位置
sum+=((*p-'A')+1)*loc;//如果此處不是空格,就根據校驗計算該位置所代表的和,進行累加
loc++;//將位置指針移動到下一個字元,同時loc也跟著變化
p++;
}
returnsum;//返回校驗和
}
voidmain()
{
intjiaoyanhe;
char*string;
printf("Pleaseinput(A-Z):");
gets(string);//使用gets函數輸入字元串;
jiaoyanhe=Quicksum(string);//調用Quicksum函數進行校驗和的計算。
printf("jiaoyanhe:");
printf("%d ",jiaoyanhe);
}
上機運行的時候,把注釋全刪了吧,要不然可能運行出錯,多體會一下吧,這只是其中的一種方法而已,多上機運行代碼,理解下裡面的邏輯,好運。
⑹ 設計演算法判斷一個算術表達式的園括弧是否正確配對,對表達式掃描
#include"stdio.h"
voidBracketMatch(char*str)/*str[]中為輸入的字元串,利用堆棧技術來檢查該字元串中的括弧是否匹配*/
{
SeqStackS;
inti;
charch;
InitStack(&S);
for(i=0;str[i]!='