㈠ 計算機圖形學:直線段掃描轉換演算法
//數值微分演算法(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;
}
不好意思,最後一個是我寫的另一個代碼,貼錯了
㈡ 計算機圖形學:Matlab編程畫直線(DDA演算法)
function DDA(x1,y1,x2,y2,color)
length =abs(x2-x1);
if abs(y2-y1)>length
length=abs(y2-y1);
end
dx=(x2-x1)/length;
dy=(y2-y1)/length;
x=x1+0.5*sign(dx);
y=y1+0.5*sign(dy);
hold on
for i=1:length
plot(round(x),round(y),'Color',color)
x=x+dx;
y=y+dy;
end
hold off
end
㈢ 求計算機圖形學中的直線繪制函數法、DDA演算法、中點法和Bresenham演算法的優缺點以及比較.
Bresenham演算法的特點是:
1,不必計巧毀首算直線之斜率,因此不做除法;
2,不用浮點數,只用整數;
3,只做整數加孝數減法和乘2運算,而乘2運算可以用硬體移位實現.
Bresenham演算法速度很快,並適余悄於用硬體實現.
DDA演算法的特點:
浮點數運算
不易硬體實現
中點畫線法特點:
只有整數運算,不含乘除法
可用硬體實現
因(X0,Y0)在直線上,所以F(X0,Y0)=0
㈣ 求計算機圖形學的中點畫拋物線詳細演算法,已經每一步實現的功能,最好能說一下思想。謝謝!
拋物線是指平面內到一個定點F(焦點)和一條定直線l(准線)距離相等的點的軌跡。它有許多表示方法,例如參數表示,標准方程表示等等。 它在幾何光學和力學中有重要的用處。 拋物線也是圓錐曲線的一種,即圓錐面與平行於某條母線的平面相截而得的曲線。二次函數的圖像就是一條拋物線,它是一個軸對稱圖形。拋物線與對稱軸的交點叫做拋物線的頂點。拋物線即把物體拋擲出去,落在遠處地面,這物體在空中經過的曲線。
平面內,到定點與定直線的距離相等的點的軌跡叫做拋物線。其中定點叫拋物線的焦點,定直線叫拋物線的准線。當拋物線的頂點為原點時,拋物線有以下特徵:
①原點在拋物線上;
②對稱軸為坐標軸;
③准線與對稱軸垂直,垂足與焦點分別對稱於原點,它們與原點的距離都等於一次項系數的絕對值的1/4。
對稱軸為x軸時,方程右端為±2px,方程的左端為y^2;對稱軸為y軸時,方程的右端為±2py,方程的左端為x^2;開口方向與x軸(或y軸)的正半軸相同時,焦點在x軸(y軸)的正半軸上,方程的右端取正號;開口方向與x(或y軸)的負半軸相同時,焦點在x軸(或y軸)的負半軸上,方程的右端取負號。
拋物線的弦是連接拋物線上任意兩點的線段。
拋物線的焦弦是經過拋物線焦點的弦。
拋物線的直徑是拋物線一組平行弦中點的軌跡。這條直徑也叫這組平行弦的共軛直徑。
希望我能幫助你解疑釋惑。
㈤ 求計算機圖形學中的直線繪制函數法、DDA演算法、中點法和Bresenham演算法的優缺點以及比較.
DDA稱為數值微分畫線演算法,是直線生成演算法中最簡單的一種.原理相當簡單,就是最直觀的根據斜率的偏移程度,決定是以x為步進方向還是以y為步進方向.然後在相應的步進方向上,步進變數每次增加一個像素,而另一個相關坐標變數則為Yk_1=Yk+m(以x為步進變數為例,m為斜率)假定直線斜率k在0~1之間,當前象素點為(xp,yp),則下一個象素點有兩種可選擇點P1(xp+1,yp)或P2(xp+1,yp+1).若P1與P2的中點(xp+1,yp+0.5)稱為M,Q為理想直線與x=xp+1垂線的交點.當M在Q的下方時,則取P2應為下一個象素點;當M在Q的上方時,則取P1為下一個象素點.這就是中點畫線法的基本原理Bresenham:過各行、各列像素中心構造一組虛擬網格線,按直線從起點到終點的順序計算直線各垂直網格線的交點,然後確定該列像素中與此交點最近的像素.該演算法的優點在於可以採用增量計算,使得對於每一列,只要檢查一個誤差項的符號,就可以確定該列所求的像素.大概就是這樣,預知詳細,
㈥ 用C++如何實現bresenham畫線演算法計算機圖形學上面有個drawpixel的函數。不知道怎麼用。
drawpixel()函數這就是VC畫點的,不同的平台由不同的函數來畫點,這個是API函數不管什麼平台歸結到底都是調用這個函數來畫點。
COLORREF SetPixel(
HDC hdc, // handle to DC
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);