❶ c語言 心形圖案代碼
#include <stdio.h>
int main(void)
{
float a,x,y;
for(y=1.5f; y>-1.5f; y-=0.1f)
{
for(x=-1.5f; x<1.5f; x+=0.05f)
{
a = x*x+y*y-1;
char ch = a*a*a-x*x*y*y*y<=0.0f?'*':' ';
putchar(ch);
}
printf(" ");
}
return 0;
}
(1)c語言幾何變換數字圖像處理代碼擴展閱讀:
書寫規則
1、一個說明或一個語句佔一行。
2、用{} 括起來的部分,專通常表示了程序的某一屬層次結構。{}一般與該結構語句的第一個字母對齊,並單獨佔一行。
3、低一層次的語句或說明可比高一層次的語句或說明縮進若干格後書寫。以便看起來更加清晰,增加程序的可讀性。在編程時應力求遵循這些規則,以養成良好的編程風格。
網路-c語言
❷ 如何用C語言實現對圖像的二值化
/*************************************************************************
* 該函數用於對圖像進行閾值分割運算
* 參數:
* LPSTR lpDIBBits - 指向源DIB圖像指針
* LONG lWidth - 源圖像寬度(象素數)
* LONG lHeight - 源圖像高度(象素數)
************************************************************************/
BOOL ImageChangeProc::ThresholdDIB(LPSTR lpDIBBits,LONG lWidth, LONG lHeight)
{
// 指向源圖像的指針
LPSTR lpSrc;
// 指向緩存圖像的指針
LPSTR lpDst;
// 指向緩存DIB圖像的指針
LPSTR lpNewDIBBits;
HLOCAL hNewDIBBits;
//循環變數
long i;
long j;
unsigned char pixel;
long lHistogram[256];
//閾值,最大灰度值與最小灰度值,兩個區域的平均灰度值
unsigned char Threshold,NewThreshold,MaxGrayValue,MinGrayValue,Temp1GrayValue,Temp2GrayValue;
//用於計算區域灰度平均值的中間變數
long lP1,lP2,lS1,lS2;
//迭代次數
int IterationTimes;
LONG lLineBytes;
hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight);
if (hNewDIBBits == NULL)
{
// 分配內存失敗
return FALSE;
}
// 鎖定內存
lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
// 初始化新分配的內存
lpDst = (char *)lpNewDIBBits;
memset(lpDst, (BYTE)255, lWidth * lHeight);
lLineBytes = WIDTHBYTES(lWidth * 8);
for (i = 0; i < 256;i++)
{
lHistogram[i]=0;
}
//獲得直方圖
MaxGrayValue = 0;
MinGrayValue = 255;
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
lHistogram[pixel]++;
//修改最大,最小灰度值
if(MinGrayValue > pixel)
{
MinGrayValue = pixel;
}
if(MaxGrayValue < pixel)
{
MaxGrayValue = pixel;
}
}
}
//迭代求最佳閾值
NewThreshold = (MinGrayValue + MaxGrayValue)/2;
Threshold = 0;
for(IterationTimes = 0; Threshold != NewThreshold && IterationTimes < 1000;IterationTimes ++)
{
Threshold = NewThreshold;
lP1 =0;
lP2 =0;
lS1 = 0;
lS2 = 0;
//求兩個區域的灰度平均值
for (i = MinGrayValue;i <=Threshold;i++)
{
lP1 += lHistogram[i]*i;
lS1 += lHistogram[i];
}
for (i = Threshold+1;i<MaxGrayValue;i++)
{
lP2 += lHistogram[i]*i;
lS2 += lHistogram[i];
}
if(lS1==0||lS2==0)
{
// 釋放內存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
return FALSE;
}
Temp1GrayValue = (unsigned char)(lP1 / lS1);
Temp2GrayValue = (unsigned char)(lP2 / lS2);
NewThreshold = (Temp1GrayValue + Temp2GrayValue)/2;
}
//根據閾值將圖像二值化
for (i = 0;i < lWidth ;i++)
{
for(j = 0;j < lHeight ;j++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
lpDst = (char *)lpNewDIBBits + lLineBytes * j + i;
pixel = (unsigned char)*lpSrc;
if(pixel <= Threshold)
{
*lpDst = (unsigned char)0;
}
else
{
*lpDst = (unsigned char)255;
}
}
}
// 復制圖像
memcpy(lpDIBBits, lpNewDIBBits, lWidth * lHeight);
// 釋放內存
LocalUnlock(hNewDIBBits);
LocalFree(hNewDIBBits);
// 返回
return TRUE;
}
參考:http://topic.csdn.net/t/20030909/13/2240079.html
❸ 編程實驗 c語言,求代碼
1、唯一要注意的是float型無法直接用%x進行十六進制的輸出,需要用某種方法依次取它的各位元組數據來輸出。
#include "stdio.h"
void main()
{
short a=-12335;
int b;
unsigned short c;
unsigned int d;
int e;
float f;
unsigned char *p;
b=(int)a;
printf("%d %x\n",b,b);
c=(unsigned short)b;
printf("%u %x\n",c,c);
d=(unsigned int)c;
printf("%u %x\n",d,d);
e=(int)d;
printf("%d %x\n",e,e);
f=(float)e;
printf("%f ",f);
p=(unsigned char *)&f;
printf("%x%x%x%x\n",p[3],p[2],p[1],p[0]);
}
2、double型和float型數據要輸出16進制形式,都要用1中用的方法
#include "stdio.h"
void main()
{
float a=123456.789e5;
double b;
float c;
unsigned char *p;
int i;
b=(double)a;
printf("%lf ",b);
p=(unsigned char*)&b;
for(i=sizeof(double)-1;i>=0;i--)
printf("%x",p[i]);
printf("\n");
c=(float)b;
printf("%f ",c);
p=(unsigned char*)&c;
for(i=sizeof(float)-1;i>=0;i--)
printf("%x",p[i]);
printf("\n");
}
3、題目要求看不懂,不知道效率是什麼意思
❹ c語言。輸出圖形,簡單代碼怎麼寫
#include<stdio.h>
#include<stdlib.h>
char a[25][25],b[2];
int n;
void fill()
{ int i,j,k;
char *p=a[0];
for(k=0; k<(n+1)/2; k++)
{ for(i=0; i<n-2*k; i++)
{p=*(a+k)+k+i*25;
for(j=0; j<n-2*k; j++)
*p++=b[k%2];
}
}
}
int main()
{ int i,j;
scanf("%d %c %c",&n,&b[0],&b[1]);
fill();
for(i=0; i<n; i++)
{ for(j=0; j<n; j++)
printf("%c",a[i][j]);
printf(" ");
}
return 0;
}
❺ 求一個C語言圖形變換程序,先進行圖形繪制,後能進行圖形復制、移動、縮放、旋轉,跪求啦。。。
從這一部分開始,進入了圖形編程的比較煩瑣的部分,要真正對圖形編程有所了解,這一部分的內容是必須要掌握的。
在計算機繪圖過程中,經常需要進行繪圖變換,主要包括二維圖形變換和三維圖形變換。這一部分討論二維圖形變換,其內容有用戶坐標到屏幕坐標的變換、圖形的比例變換、對稱變換、錯切變換、旋轉變換、平移變換和復合變換等。後面講到了二維剪裁,即線段裁剪與多邊形裁剪。
第一節 用戶坐標到屏幕坐標變換
假設紙上有一個圖形,要用計算機把它在屏幕上畫出來。那麼首先遇到的問題是,紙上的圖形採用的坐標是實數域域中的直角坐標系或是極坐標系,統稱為用戶坐標系。而屏幕上採用的坐標系是整數域中直角坐標系,這類坐標系統稱為設備坐標系。因此用戶坐標系中圖形需要經過變換才能繪制在屏幕上,顯然這個變換的內容包括: 1)將用戶坐標系中任意范圍區域轉換到屏幕某個范圍區域,從而用戶坐標系此范圍區域內的圖形也轉換到屏幕上該范圍區域內。 2)用戶坐標系此區域內圖形上的坐標值轉換到屏幕上該范圍區域內後不一定是整數,取整後才成為該范圍區域內的屏幕坐標值。 3)用戶坐標右手繫到屏幕坐標左手系的坐標軸方向變換。 4)當屏幕坐標系水平方向與垂直方向刻度不等(即像素間距不等)時,為保持圖形不走樣,還要進行比例變換。下面介紹這些內容的具體計算問題。
1.窗口到視口的變換
更確切地說,是實際圖形到屏幕圖形的轉換。有時也稱為數據規格化。
在用戶坐標系中,指定一矩形域以確定要顯示(或繪制)的圖形部分,這個矩形區域稱為窗口。在屏幕上可任選一矩形域以顯示(或繪制)窗口內的圖形,該域稱為視口。如圖2-1所示。
一般視窗口的四條邊界分別為:
左邊界 x=x1、右邊界 x=x2.下邊界 y=y1,上邊界y=y2。
視口的四條邊界分別為:
左邊界sx=sx1,右邊界sx=sx2,上邊界sy=sy1,下邊界sy=sy2。
經變換後應有,窗口的上邊界線段(或下邊界線段)長x2-x1變換成視口上邊界線段(或下邊界線段)長sx2-sx1。設其比例變換因子為k1,則可得
k1*(x2-x1)=sx2-sx1
k1=(sx2-sx1)/(x2-x1)
對窗口內任一x坐標(x1<=x<=x2)變換後為視口內水平方向sx坐標(sx1<=sx<=sx2)。由上述有:
k1*(x-x1)=sx-sx1
sx=sx1+k1*(x-x1)
=sx1+(x-x1)*(sx2-sx1)/(x2-x1)
同樣,經變換後窗口的左邊界線段(或右邊界線段)長y2-y1變換成視口左邊界線段(或右邊界線段)長sy2-sy1。設其比例變換因子為k2,則可得
k2*(y2-y1)=sy2-sy1
k2=(sy2-sy1)/(y2-y1)
對窗口內任一y坐標(y1<=y<=y2)變換後為視口內垂直sy坐標(sy1<=sy<=sy2),應有
k2*(y-y1)=sy-sy1
sy=sy1+k2*(y-y1)
=sy1+(y-y1)*(sy2-sy1)/(y2-y1)
於是對窗口內圖形上任一點坐標(x,y)變換到屏幕上視口內成為(sx,sy),則
sx=sx1+(x-x1)*(sx2-sx1)/(x2-x1)
sy=sy1+(y-y1)*(sy2-sy1)/(y2-y1)
寫成簡式
sx=k1*x+a
sy=k2*y+b
這里
a=sx1-k1*x1
b-sy1-k2*y1
k1=(sx2-sx1)/(x2-x1)
k2=(sy2-sy1)/(y2-y1)
2. 實型值到整型值的變換
上面對窗口內圖形上任一點坐標(x,y)變換到屏幕上視口內成為(sx,sy),
sx=k1*x+a
sy=k2*y+b k1,k2,a,b同上
這樣計算出來的sx,sy一般是實型值,而屏幕上視口內屏幕坐標是整型值,因此要將sx,sy實型值轉換成屏幕坐標系的整型值。這可以通過四捨五入的方法將實型值的絕對值圓整化。由於C語言中已經替我們想到了這點,它提供的函數可以自動取整,因此用戶在調用標准函數在屏幕上繪圖時一般不需要考慮這個問題。當然也可以用賦值的類型轉換規則來實現實型值到整型值的變換。
3. y坐標值方向變換
一般屏幕坐標系是直角左手系,y軸方向向下為正,原點在屏幕的左上角,如圖2-2所示。
窗口內圖形上任一點(x,y)變換到視口內成為(sx,xy),而(x,y)是相對用戶坐標系(直角右手系)的。(sx,sy)是相對屏幕坐標系(直角左手系)的,因此y軸方向相反。為使窗口內圖形變換到視口上圖形其形狀一致,需將視口上圖形y軸方向變換成窗口內圖形y軸方向。這只要將求得的視口內各點的sy整型坐標均用sy2去減,即sy2-sy(整型)代替sy(整型)即可,經這樣的坐標軸方向變換後得到的視口內圖形與窗口內圖形一致。
4.長寬比例變換
屏幕坐標系x方向與y方向上的刻度可能不一樣,這取決於水平方向像素間距與垂直方向偈素間距大小是否一致。如果兩個方向的刻度不相等,那麼用戶坐標系下一個正方形將顯示(或繪制)成為一個長方形有,一個圓將成為一個橢圓。
為保持原圖形的長寬比。使圖形顯示(或繪制)後不走樣,需求出屏幕上兩侍標軸刻度的比值(即縱橫比)。可以用函數getaspectratio()(見前文所述)返回x方向和y方向的比例數,從而求得這個比值。再瘵原圖形y方向坐標乘以該比值,這樣顯示(或繪制)出來的圖形應不走樣。若不考慮圖形的走樣,就不必作這個變換。
第二節 二維幾何變換
圖形的幾何變換一般是指對圖形的幾何信息經過變換後產生新的圖形,圖形幾何變換既可以看作是坐標系不動而圖形變動,變動後的圖形在坐標系中的坐標值發生變化;出可以看作圖形不動而坐標系變動,變動後的圖形在新坐標系下具有新的坐標值。這兩種情況本質上都是一樣的,都是圖形由新的坐標值表示,因此是新產生的圖形。圖形幾何變換包括比例變換、對稱變換、錯切變換、旋轉變換、平移變換及其復合變換。圖形上所有的點在幾何變換前後的坐標關系一般用解析幾何方法可以求得,但這些幾何關系用矩陣方法表示,運算更為方便。
一、基本變換
圖形基本幾何變換是指比例變換、對稱變換、錯切變換、旋轉變換和平移變換等。除平移變換外,這里其它四種幾何變換都可以用組成圖形的點向量(或稱1×2階矩陣)和2×2階變換矩陣相乘表示,而平移變換需引入新方法來實現。
1、比例變換
設圖形上一點P(x,y),經比例變換後成為新的菜上一點P'(x',y'),即有
x'=a*x
y'=d*y
式中a,d為比例因子
將此比例變換式寫成矩陣式得
a 0
[x' y']=[x y] = [x y] * T
0 d
a 0
這里 T= 叫做比例變換矩陣。若a=d,則x,y坐標按同一比例變換。
0 d
當a=d>1時,圖形放大;當0<a=d<1時,圖形縮小。
若a≠d,則x,y坐標按各自不同比例變換。
3 0
例 1: 設有比例變換矩陣 T= , 三角形abc經過比例變換成為三角形a'b'c'。
0 1
如圖2-3所示。
3 0
a [1 2] = [3 2] a'
0 1
3 0
b [2 2] = [6 2] b'
0 1
3 0
c [2 3] = [6 3] c'
0 1
2. 對稱變換
圖形上一點P(x,y)經關於原點對稱變換後成為新圖形上一點P'(x',y'),則
x' = -x
y' = -y
寫成矩陣形式成為
-1 0
[x' y'] = [x y] = [x y] * T
0 -1
-1 0
這里 T = 為關於原點對稱變換矩陣。
0 -1
若關於x軸對稱,則對稱變換的矩陣表示為
1 0
[x' y'] = [x y] = [x y] * T
0 -1
1 0
於是關於x軸對稱變換矩陣 T =
0 -1
若關於y軸對稱,則對稱變換的矩陣表示為
-1 0
[x' y'] = [x y] = [x y] * T
0 1
-1 0
於是關於y軸對稱變換矩陣 T =
0 1
若關於直線y = -x對稱,則對稱變換矩陣表示為
0 -1
[x' y'] = [x y] = [x y] * T
-1 0
0 1
於是關於直線 y = x對稱變換矩陣 T =
1 0
各種對稱變換的圖形均可由實常式序繪出,參見實常式序圖形。
3. 錯切變換
對圖形的任一點P(x,y),作線性變換如下
x' = x + by
y' = y + dx
式中b,d為不全為零的常 數,點P'(x',y')為新圖形上相應的點,這個變換稱為圖形的錯切變換。
錯切變換的矩陣表示為
1 d
[x' y'] = [x y] = [x y] * T
b 1
1 d
T = 叫做錯切變換矩陣(b,d不全為零)。
b 1
① 當d=0時,x'=x+by,y'=y,這時圖形的y坐標不變,x坐標值隨(x,y)及系數b作線性變化。若b>0時,圖形沿x軸作錯切位移;若b<0,圖形沿x軸負向作錯切位移。
② 當b=0時,x'=x,y'=dx+y,此時圖形的x坐標不變y坐標隨(x,y)及系數d作線性變化。如d>0,圖形沿y軸正向作錯切位移;如d<0,圖形沿y軸負向作錯切位移。
③ 當b≠0且d≠0時,x'=x+by,y'=y+dx,圖形沿x,y兩個方向作錯切位移。
1 2
例 2: 設有錯切變換 矩陣 T = ,正方形abcd經此錯切變換成為四邊形a'b'c'd',
0 1
如圖2-4所示。
1 2
a [0 0] = [0 0] a'
0 1
1 2
b [1 0] = [1 2] b'
0 1
1 2
c [1 1] = [1 3] c'
0 1
1 2
d [0 1] = [0 1] d'
0 1
4. 旋轉變換
設圖形上一點P(x,y)繞原點逆時針旋轉θ角後成為新的圖形上一點P'(x',y'),則由解析幾何方法可得
x' = xcosθ + ysinθ
y' = -xsinθ + ycosθ
用矩陣表示為
cosθ -sinθ
[x' y'] = [x y] = [x y] * T
sinθ cosθ
cosθ -sinθ
這里 T = 為繞原點逆時針變換矩陣。若順時針旋轉時,θ角為負值。
sinθ cosθ
5. 平移變換
若圖形上一點P(x,y)沿x軸平移 l距離,沿y軸平移m距離後成為新的圖形上一點P'(x',y'),則有
x' = x + l
y' = y + m
式中l,m不全為零,這稱為平移變換。但此變換無法用組成圖形的點向量和2×2階變換矩陣相乘來實現。
用二維點向量和2×2階矩陣相乘不能表示圖形的平移變換,那麼自然會想到用三維點向量和3×3階矩陣相乘來實現圖形的平移變換。因此對圖形上二個坐標的點向量需要添加一個坐標,使之成為三維點向量以便與三階矩陣相乘,進而實現用矩陣表示平移變換。實際上就是對上面的二個坐標變換式添加第三個坐標變換式,即成為
x' = x + l
y' = y + m
k = k
這第三個坐標變換式(即k=k)必須是恆等式,因為不需作變換,本質上是為了進行矩陣運算而引入的。
將此三個變換式(仍然是圖形的平移變換,不妨將k = k取成1=1)寫成矩陣得
1 0 0
[x' y' l] = [x y l] 0 1 0 = [x y 1] * T
l m 1
1 0 0
顯然 T = 0 1 0 為圖形的平移變換矩陣。
l m 1
這里通過對原圖形上二維點向量引進第三個坐標成為三維點向量,從而使原圖形的平移變換 能用矩陣表示。同樣其它基本變換也可以如此用矩陣表示。因此圖形的基本變換都可以在這樣的三維點向量下統一、整齊用矩陣表示。這樣的三維點向量稱為齊次點向量,也叫三維齊次坐標點,簡稱三維齊次坐標。只有在三維齊次坐標下,二維幾何變換才都可以用矩陣表示。下面再進一步討論一下齊次坐標的優點。
引用齊次坐標後,可將上面各種基本變換矩陣統一在一個三階矩陣中。即
a b 0
T = c d 0
l m 1
式中左上角二階矩陣實現比例、對稱、錯切、旋轉等變換,左下角1×2階矩陣實現平移變換,其中a,b,c,d,l,m只要賦以相應的值,並建立圖形上點的齊次坐標(即在圖形上點的坐標後引入第三個坐標1),這樣就可以用圖形上點的三維齊次坐標與此三階矩陣相乘來表示三維圖形的基本幾何變換了。而變換後,不用考慮第三個坐標1,前面兩個坐標就反映了圖形的整個變換情況。
用齊次坐標表示一個圖形上的點,可以有多種表示,如(6,8,1)、(12,16,2)、(30,40,5)等均表示圖形上同一個點(6,8)。這樣,齊次坐標可以表示計算機無法容納的數。例如當計算機的字長為16位時,它能表示的最大整數為216-1=32767。若點坐標為(80 000,40 000),則計算機無法表示。但用齊次坐標可表示為(20 000,10 000,1/4),經過處理後再用第三個坐標支除前面兩個坐標,從而得到原來通常的坐標。
齊次坐標優點很多,在計算機繪圖中都採用這種表示來處理圖形。下面介紹的圖形復合幾何變換就是如此。
二、復合變換
圖形的復合幾何變換是指圖形作一次以上的基本幾何變換,變換結果是每次基本變換矩陣的乘積。圖殂的復合幾何變換簡稱復合變換。
1. 復合平移
若對圖形首先作平移變換 T1,然後再作平移變換T2,相應的平移變換矩陣分別為
1 0 0
T1 = 0 1 0
l1 m1 1
1 0 0
T2 = 0 1 0
l2 m2 1
則變換結果為復合平移變換T,其復合平移變換矩陣為
T = T1 * T2
1 0 0 1 0 0
= 0 1 0 * 0 1 0
l1 m1 1 l2 m2 1
1 0 0
= 0 1 0
l1+l2 m1|m2 1